class V8::Context

def self.eval(source)

def self.eval(source)
  new.eval(source)
end

def self.open(opts = {}, &block)

def self.open(opts = {}, &block)
  new(opts).open(&block)
end

def [](key)

def [](key)
  open do
    To.ruby(@native.Global().Get(key.to_s))
  end
end

def []=(key, value)

def []=(key, value)
  value.tap do 
    open do
      @native.Global().tap do |scope|
        scope.Set(key.to_s, value)
      end
    end
  end
end

def eval(javascript, sourcename = '<eval>', line = 1)

def eval(javascript, sourcename = '<eval>', line = 1)
  if IO === javascript || StringIO === javascript
    javascript = javascript.read()
  end
  @native.open do        
    @native.eval(javascript, sourcename).tap do |result|
      raise JavascriptError.new(result) if result.kind_of?(C::Message)
      return To.ruby(result)
    end
  end
end

def evaluate(*args)

def evaluate(*args)
  self.eval(*args)
end

def initialize(opts = {})

def initialize(opts = {})      
  @native = C::Context.new(opts[:with])
end

def load(filename)

def load(filename)
  File.open(filename) do |file|
    evaluate file, filename, 1
  end      
end

def open(&block)

def open(&block)
  if block_given?
    unless @native == C::Context::GetCurrent()
      @native.open do
        block.call(self)
      end
    else
      block.call(self)
    end
  end
end