From: luke gruber Date: 2011-11-07T10:57:47+09:00 Subject: Re: Tricky DSL, how to do it? > Any ideas? This might not be the best solution, but if you give initialize an argument about its surrounding state, then it becomes easier. class Evaluator < Object attr_reader :__config__, :__outside__ def initialize(outside, &block) @__config__ = {} @__outside__ = outside instance_eval &block end def method_missing(sym, *args, &block) if block_given? @__outside__.class.class_eval do define_method sym do |*args| block.call *args end end @__config__[sym] = @__outside__.class.instance_method(sym).bind(self) else super end end end e = Evaluator.new(self) do foo do puts "foo" end end e.__config__[:foo].call I don't know if that's what you were after, but after playing around for a bit that's what I came up with. Let me know if it helps, -Luke -- Posted via http://www.ruby-forum.com/.