{#
 # Copyright 2017 The Cobalt Authors. All Rights Reserved.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
 # You may obtain a copy of the License at
 #
 #     http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing, software
 # distributed under the License is distributed on an "AS IS" BASIS,
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
 #}

{% extends "callback-interface-base.h.template" %}

{% block includes %}
{{ super() }}
#include "cobalt/script/v8c/scoped_persistent.h"
{% endblock includes %}

{% block implementation %}

{% for component in components %}
namespace {{component}} {
{% endfor %}

class {{binding_class}} : public script::v8c::ScopedPersistent<v8::Value>,
                          public {{impl_class}} {
 public:
  typedef {{impl_class}} BaseType;

  {{binding_class}}() {}
  {{binding_class}}(v8::Isolate* isolate, v8::Local<v8::Value> handle)
      : ScopedPersistent(isolate, handle), isolate_(isolate) {}

{% for operation in operations %}
{% for overload in operation.overloads %}
  {{overload.type}} {{overload.name}}(
      const scoped_refptr<script::Wrappable>& callback_this,
    {% for arg in overload.arguments %}
      {{arg.arg_type}} {{arg.name}},
    {% endfor %}
      bool* had_exception) const override;
{% endfor %}
{% endfor %}

 private:
  v8::Isolate* isolate_;
};

{% for component in components|reverse %}
}  // namespace {{component}}
{% endfor %}

namespace cobalt {
namespace script {

// Explicit instantiation of CallbackInterfaceTraits struct so we can infer
// the type of the generated class from the type of the callback interface.
template<>
struct CallbackInterfaceTraits<{{fully_qualified_impl_class}}> {
  typedef {{fully_qualified_binding_class}} V8cCallbackInterfaceClass;
};

}  // namespace script
}  // namespace cobalt

{% endblock implementation %}
