From: Marat Kamenschikov Date: 2010-03-27T07:35:16+09:00 Subject: Re: changing method behavior depending on context Thanks Jesus and Robert! But the case is quite more complex because (I forgot to mention in original message) I'm not calling B#save directly - it's a part of a big class which builds many objects and the option is either replace all .save with .save(false) or to make some monkey magic. The B class might go into some lib or plugin (but not sure yet) so I need to find a way for this case also. My friend and I came to this kind of solution: class B def initialize @a=A.new @a.instance_eval <<-EOF alias :old_save :save def save(validate = false) old_save(validate) end EOF end The only thing that this would save without validation only one time, if there'd be smth like class B def initialize @a1 = A.new @a2 = A.new end def save @a1.save @a2.save # it wouldn't work here or I'd need to define same methods n times end end I will agree if you say that doesn't worth that but that becomes a ruby riddle - is it powerful enough to change behaviour depending on context? I think it is. Curious how. Robert Klemme wrote: > On 03/26/2010 05:11 PM, Marat Kamenschikov wrote: >> def save(validate = true) >> @a.save >> a way to redef a method inside of other class' scope? > What's wrong with doing > > class B > # something very crazy > def initialize > @a = A.new > end > def save > @a.save false > end > end > > as Jesus suggested? Even if you don't do that you could do > > class A > def initialize(owner = nil) > @owner = owner > end > > def save > B === @owner ? "VALID" : "INVALID" > end > end > > class B > # something not so crazy > def initialize > @a = A.new self > end > def save > @a.save > end > end > > Note: meta programming magic also makes code harder to read. > > Kind regards > > robert -- Posted via http://www.ruby-forum.com/.