// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.

#ifndef Dart$(INTERFACE)_h
#define Dart$(INTERFACE)_h

#include "bindings/dart/DartDOMWrapper.h"
$WEBCORE_INCLUDES

// FIXME: We need this to access the WrapperTypeInfo.
$V8_INTERFACE_INCLUDE

#include <dart_api.h>

namespace WebCore {

struct Dart$INTERFACE {
    static const int dartClassId = $(INTERFACE)ClassId;
    typedef $WEBCORE_CLASS_NAME NativeType;
    static const bool isNode = $IS_NODE;
    static const bool isActive = $IS_ACTIVE;
    static const bool isEventTarget = $IS_EVENT_TARGET;

    static ActiveDOMObject* toActiveDOMObject(void* value)
    {
        $TO_ACTIVE
    }
    static EventTarget* toEventTarget(void* value)
    {
        $TO_EVENT_TARGET
    }
    static Node* toNode(void* value)
    {
        $TO_NODE
    }
    static $WEBCORE_CLASS_NAME* toNative(void* value)
    {
        return static_cast<$WEBCORE_CLASS_NAME*>(value);
    }

$TO_NATIVE
$TO_DART
    static Dart_Handle toDart(PassRefPtr< $WEBCORE_CLASS_NAME > value)
    {
        return toDart(value.get());
    }
    static Dart_Handle createWrapper(PassRefPtr< $WEBCORE_CLASS_NAME > value)
    {
        return createWrapper(value.get());
    }
    static void returnToDart(Dart_NativeArguments args,
                             PassRefPtr< $WEBCORE_CLASS_NAME > value,
                             bool autoDartScope = true)
    {
        return returnToDart(args, value.get(), autoDartScope);
    }

    static Dart_NativeFunction resolver(Dart_Handle name,
                                        int argumentCount,
                                        bool* autoSetupScope);
};

Dart_Handle $(WEBCORE_CLASS_NAME_ESCAPED)_toDart(PassRefPtr< $WEBCORE_CLASS_NAME > value);

namespace Dart$(INTERFACE)Internal {
$DECLARATIONS
}

}  // namespace WebCore

#endif // Dart$(INTERFACE)_h
