module Datahen::Plugin::ContextExposer

Public Class Methods

exposed_methods() click to toggle source
# File lib/datahen/plugin/context_exposer.rb, line 4
def self.exposed_methods
  raise NotImplementedError.new('Specify methods exposed to isolated env')
end

Public Instance Methods

create_context(vars = {}) click to toggle source

Create isolated context object from self

# File lib/datahen/plugin/context_exposer.rb, line 33
def create_context vars = {}
  create_top_object_script = '(
    lambda do
      object = Object.new
      metaclass = class << object
        define_method(:context_binding){binding}
      end
      object
    end
  ).call'
  object = TOPLEVEL_BINDING.eval(create_top_object_script)
  env = exposed_env(vars)
  expose_to object, env
  object
end
expose_to(object, env) click to toggle source
# File lib/datahen/plugin/context_exposer.rb, line 24
def expose_to object, env
  metaclass = class << object; self; end
  env.each do |key, block|
    metaclass.send(:define_method, key, block)
  end
  object
end
exposed_env(vars) click to toggle source
# File lib/datahen/plugin/context_exposer.rb, line 19
def exposed_env vars
  keys = exposed_methods + vars.keys
  Hash[keys.uniq.map{|key|[key, var_or_proc(vars, key)]}]
end
exposed_methods() click to toggle source
# File lib/datahen/plugin/context_exposer.rb, line 8
def exposed_methods
  self.class.exposed_methods
end
isolated_binding(vars = {}) click to toggle source

Create an isolated binding

# File lib/datahen/plugin/context_exposer.rb, line 50
def isolated_binding vars = {}
  create_context(vars).context_binding
end
var_or_proc(vars, key) click to toggle source

Create lambda to retrieve a variable or call instance method

# File lib/datahen/plugin/context_exposer.rb, line 13
def var_or_proc vars, key
  myself = self # Avoid stack overflow
  return lambda{vars[key]} if vars.has_key?(key)
  lambda{|*args| myself.send(key, *args)}
end