Monkeypatching multiple classes with similar methods

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 —

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

On 22 Sep, 10:56, Ehsanul H. [email protected] wrote:

end

Hello!
method?
class Klass2
end
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

Exactly what I needed (and even simpler than I though). Your solution
works perfectly. Thank you!

/lasso

You’re welcome! I’m just glad to be of service to the ruby community
(finally). =)