{% include 'copyright_block.txt' %}
#ifndef {{v8_class_or_partial}}_h
#define {{v8_class_or_partial}}_h

{% for filename in header_includes %}
#include "{{filename}}"
{% endfor %}

namespace blink {
{% if attributes|origin_trial_enabled_attributes %}
class ScriptState;
{% endif %}

class {{v8_class_or_partial}} {
    STATIC_ONLY({{v8_class_or_partial}});
public:
    static void initialize();
    {% for method in methods if method.is_custom %}
    static void {{method.name}}MethodCustom(const v8::FunctionCallbackInfo<v8::Value>&);
    {% endfor %}
    {% for attribute in attributes %}
    {% if attribute.has_custom_getter %}{# FIXME: and not attribute.implemented_by #}
    static void {{attribute.name}}AttributeGetterCustom(const v8::PropertyCallbackInfo<v8::Value>&);
    {% endif %}
    {% if attribute.has_custom_setter %}{# FIXME: and not attribute.implemented_by #}
    static void {{attribute.name}}AttributeSetterCustom(v8::Local<v8::Value>, const v8::PropertyCallbackInfo<void>&);
    {% endif %}
    {% endfor %}
    {# Custom internal fields #}
    static void preparePrototypeAndInterfaceObject(v8::Local<v8::Context>, const DOMWrapperWorld&, v8::Local<v8::Object>, v8::Local<v8::Function>, v8::Local<v8::FunctionTemplate>);
    {% for origin_trial_feature in origin_trial_features %}{{newline}}
    static void install{{origin_trial_feature.name}}(ScriptState*, v8::Local<v8::Object> instance);
    {% if not origin_trial_feature.needs_instance %}
    static void install{{origin_trial_feature.name}}(ScriptState*);
    {% endif %}
    {% endfor %}
private:
    static void install{{v8_class}}Template(v8::Isolate*, const DOMWrapperWorld&, v8::Local<v8::FunctionTemplate> interfaceTemplate);
};
}
#endif // {{v8_class_or_partial}}_h
