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

Version Path
answersengine-0.10.1 lib/answersengine/plugin/context_exposer.rb
answersengine-0.10.0 lib/answersengine/plugin/context_exposer.rb
answersengine-0.9.1 lib/answersengine/plugin/context_exposer.rb
answersengine-0.9.0 lib/answersengine/plugin/context_exposer.rb
answersengine-0.8.0 lib/answersengine/plugin/context_exposer.rb
answersengine-0.7.0 lib/answersengine/plugin/context_exposer.rb
answersengine-0.6.0 lib/answersengine/plugin/context_exposer.rb
answersengine-0.5.0 lib/answersengine/plugin/context_exposer.rb
answersengine-0.4.1 lib/answersengine/plugin/context_exposer.rb
answersengine-0.4.0 lib/answersengine/plugin/context_exposer.rb
answersengine-0.3.3 lib/answersengine/plugin/context_exposer.rb
answersengine-0.3.2 lib/answersengine/plugin/context_exposer.rb
answersengine-0.3.1 lib/answersengine/plugin/context_exposer.rb
answersengine-0.3.0 lib/answersengine/plugin/context_exposer.rb
answersengine-0.2.33 lib/answersengine/plugin/context_exposer.rb