Sha256: e3c14b6049e999c2958bd63c8c0124d245a42c2b07e06c66d218862707f07c14
Contents?: true
Size: 1.46 KB
Versions: 15
Compression:
Stored size: 1.46 KB
Contents
module AnswersEngine module Plugin module ContextExposer def self.exposed_methods raise NotImplementedError.new('Specify methods exposed to isolated env') end def exposed_methods self.class.exposed_methods end # Create lambda to retrieve a variable or call instance method 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 def exposed_env vars keys = exposed_methods + vars.keys Hash[keys.uniq.map{|key|[key, var_or_proc(vars, key)]}] end def expose_to object, env metaclass = class << object; self; end env.each do |key, block| metaclass.send(:define_method, key, block) end object end # Create isolated context object from self 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 # Create an isolated binding def isolated_binding vars = {} create_context(vars).context_binding end end end end
Version data entries
15 entries across 15 versions & 1 rubygems