From: dblack@... Date: 2006-03-12T13:35:55+09:00 Subject: Re: Adding methods to a singleton dynamically 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 # # __END__ David -- David A. Black (dblack@wobblini.net) Ruby Power and Light, LLC (http://www.rubypowerandlight.com) "Ruby for Rails" chapters now available from Manning Early Access Program! http://www.manning.com/books/black