docile/lib/docile.rb

33 lines
1.1 KiB
Ruby
Raw Normal View History

2011-12-06 18:51:56 +00:00
require "docile/version"
require "docile/fallback_context_proxy"
2011-12-06 18:51:56 +00:00
module Docile
2011-12-06 19:46:46 +00:00
# Executes a block in the context of an object whose interface represents a DSL.
#
# Example of using an Array as a DSL:
2011-12-06 23:46:14 +00:00
#
# Docile.dsl_eval [] do
# push 1
# push 2
# pop
# push 3
# end
# #=> [1, 3]
2011-12-06 19:46:46 +00:00
#
# @param dsl [Object] an object whose methods represent a DSL
# @param block [Proc] a block to execute in the DSL context
# @return [Object] the dsl object, after execution of the block
2011-12-06 19:46:46 +00:00
def dsl_eval(dsl, &block)
block_context = eval("self", block.binding)
proxy_context = FallbackContextProxy.new(dsl, block_context)
begin
block_context.instance_variables.each { |ivar| proxy_context.instance_variable_set(ivar, block_context.instance_variable_get(ivar)) }
proxy_context.instance_eval(&block)
ensure
block_context.instance_variables.each { |ivar| block_context.instance_variable_set(ivar, proxy_context.instance_variable_get(ivar)) }
end
2011-12-06 19:46:46 +00:00
dsl
end
module_function :dsl_eval
2011-12-06 18:51:56 +00:00
end