From: William Djaja Tjokroaminata Date: 2002-10-17T04:44:36+09:00 Subject: Re: Hooking on method invocation Hi, I am sorry that I think the whole discussion has advanced to a new level; but to answer the original question, can't we do a simple thing like: $blocked = true (Foo.new.methods - Object.methods).each do |met| str = "class Foo\n" str << " alias #{met}_original #{met}\n" str << " def #{met} (*args)\n" str << " if $blocked\n" str << " puts 'blocked'\n" str << " else\n" str << " #{met}_original(*args)" str << " end\n" str << " end\n" str << "end" eval str end ? The code above can easily be modified to pick which methods to block (by matching "met" with a regexp), to notify the observer, etc. This is of course if we don't want to go into some aspect-oriented programming, as also has been suggested. Regards, Bill ============================================================================ Eugene Zaikonnikov wrote: > Hello, > Is there a way to hook on invocation of *any* instance method of an > object? > My first attempt was to override the send method: > class Foo > #just ban them > def send(symbol, *args) > puts "blocked" > end > end > It works when I do: > foo = Foo.new > foo.send :something > But it has no effect on "conventional" method invocations. It seems > that send is not a part of the built-in method dispatch procedure. > I want such functionality to implement 'write barriers' for certain > objects. The idea was to track invocation of writer methods and notify > object's observer of changes. If this is achievable by other means, > any hints will be greatly appreciated. > -- > Eugene