{#
 # Copyright 2017 Google Inc. 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 %}
