[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Adding methods to a singleton dynamically

Clint

3/12/2006 12:16:00 AM

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] => {}
}
}


Thanks,
Mike
3 Answers

dblack

3/12/2006 4:02:00 AM

0

dblack

3/12/2006 4:36:00 AM

0

Clint

3/12/2006 8:45:00 PM

0

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