2007/10/12, Ross X Dawson <Ross.Dawson / aas.com.au>:
> irb(main):001:0> drill_down = lambda do |obj, method_names|
> irb(main):002:1*        o ||= obj
> irb(main):003:1>        method_names.split('.').each {|m| o = o.send(m)}
> irb(main):004:1>        o
> irb(main):005:1> end
> => #<Proc:0x40221e48@(irb):1>
> irb(main):006:0> drill_down.call(1,'succ.to_s')
> => "2"
> irb(main):007:0> drill_down.call(1,'succ.succ.succ.to_s')
> => "4"

Ross, I would implement something like that with Enumerable#inject:

  def drill_down(obj, method_names)
    method_names.split('.').inject(obj) {|o, m| o.send(m)}
  end

But I'm not quite sure that having strings with method calls is the
way to go. Where do the strings with the method names come from? Do
the users of your application have to enter them somewhere? What about
arguments to the method calls?

Regards,
Pit