
Untitled
By: a guest on
Apr 28th, 2012 | syntax:
None | size: 0.91 KB | hits: 15 | expires: Never
class HouseDetail
def foo
return [1,2,3]
end
end
class KeyInvoker
instance_methods.reject {|meth| meth.to_s =~ /^_/ }.each { |meth| undef_method(meth.to_sym) }
def initialize(object)
@proxy_object = object
end
def call(path)
path_elements = path.split(".")
meth, path = path_elements.shift, path_elements.join('.')
value = __send__(meth)
if path_elements.empty?
respond_to?(meth) ? value : nil
else
KeyInvoker.new(value).call(path)
end
end
def respond_to?(meth)
@proxy_object.respond_to?(meth)
end
def method_missing(meth, *args, &blk)
if @proxy_object.respond_to?(meth)
@proxy_object.send(meth)
else
@proxy_object
end
end
end
ki = KeyInvoker.new(HouseDetail.new)
puts ki.call("house_detail.foo.length.to_s")
puts ki.call("house_detail.foo2.length")
puts ki.call("house_detail2.foo.length")
puts ki.call("house_detail.foo.length3")