dblack / wobblini.net wrote:
 > I just *know* there's a way to do this with inject... :-)  But
 > meanwhile, see if this is of any use.  It's a whole little
 > self-contained simulation.

Thanks, that does the job.  I was a little unclear of how << worked but now I 
get it.

Mike

dblack / wobblini.net wrote:
> Hi --
> 
> On Sun, 12 Mar 2006, Mike Austin wrote:
> 
>> I'm building a view hierarchy from a file, and I would like it to add 
>> getter methods for every subview created.  For example, I should be 
>> able to write:
>>
>> window.bottom_panel.save_button.left = 20
>>
>> I played around with singleton classes and define_method, am I close?  
>> I wonder if it is illegal to do 'class << self end' within a method - 
>> I get the error 'class definition in method body'
>>
>> hierarchy.each do |key, value|
>>  view = Object::const_get( key[1] ).new
>>
>>  class << self end
>>
>>  self.class.class_eval do
>>    define_method( key[1] ) do
>>      return view
>>    end
>>  end
>> end
>>
>> hierarchy = {
>>  [:bottom_panel, :Panel] => {
>>    [:save_button, :Button] => {}
>>  }
>> }
> 
> I just *know* there's a way to do this with inject... :-)  But
> meanwhile, see if this is of any use.  It's a whole little
> self-contained simulation.
> 
> def cascade_from_hierarchy(base,hierarchy)
>   label, kind = *hierarchy.keys[0]
>   rest = hierarchy.values[0]
>   view = kind.new
> 
>   (class << base; self; end).class_eval do
>     define_method(label) { view }
>   end
> 
>   cascade_from_hierarchy(view,rest) unless rest.empty?
> end
> 
> class Panel; end
> class Button; end
> class Window; end
> 
> window = Window.new
> hierarchy = {
>   [:bottom_panel, Panel] => {
>     [:save_button, Button] => {}
>   }
> }
> 
> cascade_from_hierarchy(window,hierarchy)
> 
> p window.bottom_panel.save_button # #<Button:0x1ceb58>
> 
> __END__
> 
> 
> David