On Tue, Sep 28, 2004 at 02:35:58AM +0900, Markus wrote: > On Mon, 2004-09-27 at 09:53, Mauricio FernáÏdez 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) 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? -- Running Debian GNU/Linux Sid (unstable) batsman dot geo at yahoo dot com