batsman@tux-chan:/tmp$ ruby -v gdfgrre.rb
ruby 1.8.2 (2004-09-22) [i686-linux]
#<ArgumentError: wrong number of arguments (1 for 2)>
A#foo a: 1 b: 2
#<ArgumentError: wrong number of arguments (3 for 2)>
A#foobar a: [1, 2]
#<ArgumentError: wrong number of arguments (2 for 1)>
A#bar a: [[1, 2, 3]]
A#bar a: [1, 2, 3]
batsman@tux-chan:/tmp$ cat gdfgrre.rb
module Magic
def wrap_method(*names, &block)
names.each do |name|
old = instance_method(name)
define_method(name) do |*a| # |*a, &b| on 1.9
block.call(name, old.bind(self), *a)
end
end
end
end
class A
def foo(a,b); puts "A#foo a: #{a.inspect} b: #{b.inspect}" end
def foobar(a); puts "A#foobar a: #{a.inspect}" end
def bar(*a); puts "A#bar a: #{a.inspect}" end
end
class B < A
extend Magic
wrap_method(:foo, :bar, :foobar) do |meth, old, *args|
old.call(*args)
end
end
b = B.new
b.foo [1,2] rescue p $!
b.foo 1, 2
b.foo 1, 2, 3 rescue p $!
b.foobar [1,2]
b.foobar(1, 2) rescue p $!
b.bar [1,2,3]
b.bar 1, 2, 3
propagation in 1.9 maybe?
···
On Tue, Sep 28, 2004 at 02:35:58AM +0900, Markus wrote:
On Mon, 2004-09-27 at 09:53, Mauricio Fernández wrote:
> module Magic
> def wrap_method(*names, &block)
> names.each do |name|
> old = instance_method(name)
> define_method(name) do |*a| # |*a, &b| on 1.9
> block.call(name, old.bind(self), *a) # &b on 1.9
> end
> end
> end
> end
Note, though, that this will fail under 1.8.1 & 1.8.2Pre (but not, I
hope, under later versions)
--
Running Debian GNU/Linux Sid (unstable)
batsman dot geo at yahoo dot com