class V8::Portal::ConstructorAdapter

def allocate(object)

def allocate(object)
  arguments = C::Array::New(1)
  arguments.Set(0, C::External::New(object))
  function.NewInstance(arguments)
end

def disable

def disable
  @disabled = true
end

def enable

def enable
  @disabled = nil
end

def exposed=(exposed)

def exposed=(exposed)
  if exposed && !@augmented
    #create a prototype so that this constructor also acts like a ruby object
    prototype_template = C::ObjectTemplate::New()
    portal.interceptors.setup(prototype_template)
    prototype = prototype_template.NewInstance()
    #set *that* object's prototype to an empty function so that it will look and behave like a function.
    prototype.SetPrototype(C::FunctionTemplate::New().GetFunction())
    template.GetFunction().SetPrototype(prototype)
    @augmented = true
  end
  @exposed = exposed
end

def function

def function
  @template.GetFunction()
end

def initialize(templates, class_id)

def initialize(templates, class_id)
  @exposed = false
  @class_id = class_id
  @templates = templates
  @invoke = method(:invoke)
  @template = C::FunctionTemplate::New(@invoke)
  portal.interceptors.setup(@template.InstanceTemplate())
  cls = self.ruby_class
  superclass = cls.superclass
  if cls != ::Object && superclass != ::Object && superclass != ::Class
    @template.Inherit(templates.to_constructor(superclass).template)
  end
  if cls.name && cls.name =~ /(::)?(\w+?)$/
    template.SetClassName(C::String::NewSymbol("rb::" + $2))
  else
    template.SetClassName("Ruby")
  end
end

def invoke(arguments)

def invoke(arguments)
  return if @disabled
  if !@exposed
    unless arguments.Length() == 1 && arguments[0].kind_of?(C::External)
      C::ThrowException(C::Exception::Error(C::String::New("cannot call native constructor from javascript")))
    else
      object = arguments[0].Value()
      proxies.register_javascript_proxy arguments.This(), :for => object
    end
  else
    instance = nil
    if arguments.Length() > 0 && arguments[0].kind_of?(C::External)
      instance = arguments[0].Value()
    else
      rbargs = []
      for i in 0..arguments.Length() - 1
        rbargs << @templates.portal.rb(arguments[i])
      end
      instance = portal.caller.raw do
        self.ruby_class.new(*rbargs)
      end
    end
    proxies.register_javascript_proxy arguments.This(), :for => instance
  end
end

def portal

def portal
  @templates.portal
end

def proxies

def proxies
  @templates.proxies
end

def ruby_class

def ruby_class
  ObjectSpace._id2ref(@class_id)
end