From: Lars Olsson Date: 2009-09-22T18:10:17+09:00 Subject: Re: Monkeypatching multiple classes with similar methods On 22 Sep, 10:56, Ehsanul Hoque wrote: > Hey. You just have a tiny couple of bugs. Try this instead (untested, but you get the idea): > > [Klass1, Klass2, Klass3].each do |klass| >   klass.module_eval do >     alias_method :original_meth, :meth >     def meth(*stuff, &block) >       puts "#{self.class}.meth has been patched" >       original_meth(*stuff, &block) >     end >   end > end > > > > > > > Date: Tue, 22 Sep 2009 17:45:06 +0900 > > From: la...@lassoweb.se > > Subject: Monkeypatching multiple classes with similar methods > > To: ruby-t...@ruby-lang.org > > > Hello! > > > I'm trying to monkeypatch a number of related classes that all > > implements the same method (meth). The methods all take one required > > argument (stuff) but some of the individual methods may require more > > arguments (or a block). All I want to do in each call to meth is to > > print some debug data and then pass the incoming arguments to the > > original method. This works great as long as I know the exact number > > of arguments required, but when the number of arguments starts to > > change my code breaks badly. Is there any way (in ruby 1.8.7) to > > "copy" the original method signature when defining my own replacement > > method? > > > /lasso > > > --- CODE START --- > > class Klass1 > >   def meth(stuff) > >     puts "You've sent #{stuff} to #{self.class}.meth" > >   end > > end > > > class Klass2 > >   def meth(stuff, &block) > >     block_text = block_given? ? 'with' : 'without' > >     puts "You've sent #{stuff} to #{self.class}.meth #{block_text} a > > block" > >   end > > end > > > class Klass3 > >   def meth(stuff, morestuff) > >     puts "You've sent #{stuff} to #{self.class}.meth" > >   end > > end > > > # Broken monkeypatching. Only works on Klass1 > > [Klass1, Klass2, Klass3].each do |klass| > >   klass.module_eval do > >     alias_method :original_meth, :meth > >     def meth(stuff) > >       puts "#{self.class}.meth has been patched" > >       original_meth(stuff) > >     end > >   end > > end > > > Klass1.new.meth('one') > > Klass2.new.meth('two') { 'three' } # Block is not passed after > > monkeypatching > > Klass2.new.meth('four') > > Klass3.new.meth('five', 'six') # Raises ArgumentError after > > monkeypatching > > --- CODE END --- > > _________________________________________________________________ > Microsoft brings you a new way to search the web.  Try  Bing™ nowhttp://www.bing.com?form=MFEHPG&publ=WLHMTAG&crea=TEXT_MFEHPG_Core_ta...bing_1x1- Dölj citerad text - > > - Visa citerad text - Exactly what I needed (and even simpler than I though). Your solution works perfectly. Thank you! /lasso