Sha256: 21daf8f8a4f6e1700bddc52b80a0a1fecb9430c72a6daf6c24da706bbbfbd66d

Contents?: true

Size: 1.29 KB

Versions: 13

Compression:

Stored size: 1.29 KB

Contents

module DynamicBinding
  class LookupStack
    def initialize(bindings = [])
      @bindings = bindings
    end

    def method_missing(m, *args)
      @bindings.reverse_each do |bind|
        begin
          method = eval("method(%s)" % m.inspect, bind)
        rescue NameError
        else
          return method.call(*args)
        end
        begin
          value = eval(m.to_s, bind)
          return value
        rescue NameError
        end
      end
      raise NoMethodError, "No such variable or method: %s" % m
    end

    def pop_binding
      @bindings.pop
    end

    def push_binding(bind)
      @bindings.push bind
    end

    def push_instance(obj)
      @bindings.push obj.instance_eval { binding }
    end

    def push_hash(vars)
      push_instance Struct.new(*vars.keys).new(*vars.values)
    end

    def get_binding
      instance_eval { binding }
    end

    def run_proc(p, *args)
      instance_exec(*args, &p)
    end

    def push_method(name, p, obj=nil)
      x = Object.new
      singleton = class << x; self; end
      singleton.send(:define_method, name, lambda { |*args|
        obj.instance_exec(*args, &p)
      })
      push_instance x
    end
  end
end

class Proc
  def call_with_binding(bind, *args)
    ::DynamicBinding::LookupStack.new([bind]).run_proc(self, *args)
  end
end

Version data entries

13 entries across 13 versions & 1 rubygems

Version Path
listings-0.1.15 lib/listings/dynamic_binding.rb
listings-0.1.14 lib/listings/dynamic_binding.rb
listings-0.1.13 lib/listings/dynamic_binding.rb
listings-0.1.12 lib/listings/dynamic_binding.rb
listings-0.1.11 lib/listings/dynamic_binding.rb
listings-0.1.10 lib/listings/dynamic_binding.rb
listings-0.1.8 lib/listings/dynamic_binding.rb
listings-0.1.7 lib/listings/dynamic_binding.rb
listings-0.1.6 lib/listings/dynamic_binding.rb
listings-0.1.5 lib/listings/dynamic_binding.rb
listings-0.1.4 lib/listings/dynamic_binding.rb
listings-0.1.0 lib/listings/dynamic_binding.rb
listings-0.0.3 lib/listings/dynamic_binding.rb