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