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