From: Trans Date: 2007-11-14T12:12:49+09:00 Subject: Re: method_added/define_method infinite loop On Nov 13, 3:36 pm, "ara.t.howard" wrote: > On Nov 13, 2007, at 7:24 AM, Trans wrote: > > > > > What's the best way to avoid the classic method_added/define_method > > infinite loop? > > > class X > > def self.method_added(name) > > p name > > define_method(name) > > # do something else > > end > > end > > > def foo; end > > end > > > This will, of course, print "foo" forever. > > > As an aside, anyone else think method_added should also receive a > > block of the method definition? E.g. this would be a "push" (less the > > infinite loop issue): > > > def self.method_added(name, &block) > > define_method(name, &block) > > end > > > Thanks! > > T. > > cfp:~ > cat a.rb > class X > class << self > def ignoring_added_methods > ignoring_added_methods = @ignoring_added_methods > @ignoring_added_methods = true > yield > ensure > @ignoring_added_methods = ignoring_added_methods > end > > def ignoring_added_methods? > defined? @ignoring_added_methods and @ignoring_added_methods > end > > def method_added name > return if ignoring_added_methods? > ignoring_added_methods do > p name > define_method(:bar){} > end > end > end > > def foo > end > end > > cfp:~ > ruby a.rb > :foo nice. i like the way you did that. thanks ara. only question i have is about thread safety --could the instance var pose a potential problem with that? T.