"Robert Klemme" <bob.news / gmx.net> schrieb im Newsbeitrag news:...
>
> "Pe?a, Botp" <botp / delmonte-phil.com> schrieb im Newsbeitrag
>
news:1030AB5FAD0A3847B7B1F7B93332AFB501E18290 / bgmail00.delmonte-phil.com...
> > Hi Friends,
> >
> > Forgive me in adv for asking a newbie question.
> >
> > 1. First question: How do I get the the method passed?
> >
> > Eg.
> >
> > >cat test1.rb
> > #-------------------------
> > class Dog
> >    def bark
> >        'arf!arf!'
> >    end
> >    def method_missing(x)
> > p "method missing"
> >        "sorry, cannot do #{x} in #{self}"
> >    end
> > end
> >
> > beethoven = Dog.new
> > p beethoven.bark
> > p beethoven.purr
> > #-------------------------
> >
> > >ruby -w test1.rb
> > "arf!arf!"
> > "sorry, cannot do purr in #<Dog:0x2777228>"
> >
> >
> > I'd like a method similar to method_missing(x) (wherein the methodname
is
> > passed in x), but only access it before a method is run (maybe name it
> > method_called(x)).
> >
> > So I can do (maybe),
> >
> > ..
> > Class Dog
> > ..
> >    def method_called(x)
> >        p "You ask for #{x}"
> >    end
> > end
>
> Tracing is one option. See
> http://www.rubycentral.com/book/ref_m_kernel.html#Kernel.set_trace_func
>
> Another option is to use a similar scheme as in Delegator and
automatically
> generate proxy methods that invoke your "method_called" just before they
> hand over control to the real method.
> http://www.rubycentral.com/book/lib_patterns.html
>
> Which of the approaches you choose depends on your situation.
>
> Tehre might be another option to define a module / class method that
> automatically creates a new method that first invokes method_called and
the
> the original method.  Sorryy, I don't have the time at the moment to put
> such a thing together.

Cancel that.  This works:

class Module
  def notify(sym)
    new_sym = "#{sym}_old".intern
    alias_method new_sym.to_s, sym.to_s

    define_method sym do |*args|
      puts "#{sym} called with args: #{args.inspect}"
      send( new_sym, *args )
    end
  end
end


class Foo
  def bar
    puts "bar!"
  end

  notify :bar
end

Foo.new.bar


Regards

    robert