Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on Apr 28th, 2012  |  syntax: None  |  size: 0.91 KB  |  hits: 15  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. class HouseDetail
  2.   def foo
  3.     return [1,2,3]
  4.   end
  5. end
  6.  
  7. class KeyInvoker
  8.  
  9.   instance_methods.reject {|meth| meth.to_s =~ /^_/ }.each { |meth| undef_method(meth.to_sym) }
  10.  
  11.   def initialize(object)
  12.     @proxy_object = object
  13.   end
  14.  
  15.   def call(path)
  16.     path_elements = path.split(".")
  17.     meth, path = path_elements.shift, path_elements.join('.')
  18.     value = __send__(meth)
  19.     if path_elements.empty?
  20.       respond_to?(meth) ? value : nil
  21.     else
  22.       KeyInvoker.new(value).call(path)
  23.     end
  24.   end
  25.  
  26.   def respond_to?(meth)
  27.     @proxy_object.respond_to?(meth)
  28.   end
  29.  
  30.   def method_missing(meth, *args, &blk)
  31.     if @proxy_object.respond_to?(meth)
  32.       @proxy_object.send(meth)
  33.     else
  34.       @proxy_object
  35.     end
  36.   end
  37. end
  38.  
  39. ki = KeyInvoker.new(HouseDetail.new)
  40. puts ki.call("house_detail.foo.length.to_s")
  41. puts ki.call("house_detail.foo2.length")
  42. puts ki.call("house_detail2.foo.length")
  43. puts ki.call("house_detail.foo.length3")