Sha256: 080929498d32837ae5f17134b156152445fc7a8221f7538bcaf4254253767e7e

Contents?: true

Size: 1.32 KB

Versions: 4

Compression:

Stored size: 1.32 KB

Contents

#!/usr/bin/env ruby

require 'dslkit/polite'

LetScope = DSLKit::BlankSlate.with :instance_eval, :to_s, :inspect, :extend
class LetScope
  include DSLKit::MethodMissingDelegator::DelegatorModule
  include DSLKit::BlockSelf

  def initialize(my_self, bindings = {}, outer_scope = nil)
    super(my_self)
    @outer_scope = outer_scope
    @bindings = bindings
    extend DSLKit::Eigenclass
    eigenclass_eval { extend DSLKit::Constant }
    each_binding do |name, value|
      eigenclass_eval {  constant name, value }
    end
  end

  def each_binding(&block)
    if @outer_scope
      @outer_scope.each_binding(&block)
    end
    @bindings.each(&block)
  end

  def let(bindings = {}, &block)
    ls = LetScope.new(block_self(&block), bindings, self)
    ls.instance_eval(&block)
  end

  # Inlcuding this module into your current namespace defines the let method.
  module Include
    include DSLKit::BlockSelf

    def let(bindings = {}, &block)
      ls = LetScope.new(block_self(&block), bindings)
      ls.instance_eval(&block)
    end
  end
end

if $0 == __FILE__
  class Foo
    include LetScope::Include

    def twice(x)
      2 * x
    end

    def test
      let :x => 1, :y => twice(1) do 
        let :z => twice(x) do
          puts "#{x} * #{y} == #{z} # => #{x * y == twice(x)}"
        end
      end
    end
  end

  Foo.new.test
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
dslkit-0.2.5 examples/let.rb
dslkit-0.2.2 examples/let.rb
dslkit-0.2.3 examples/let.rb
dslkit-0.2.4 examples/let.rb