On Sat, 22 Oct 2005, Eric Mahurin wrote:
> Here is a pure ruby soluntion to doing AOP. You just need one
> little method from evil.rb: Object#become. sub-classing and
> then having the parent "become" the child is very similar to
> the proposed "cut" (not sure about some of the management
> facilities). Anyways, as soon as you require 'evil.rb' you
> pretty much have it. You can get evil.rb here:
> http://rubyforge.org/cgi-bin/viewcvs.cgi/evil/lib/evil.rb?cvsroot=evil
> Here is a demo using this to get AOP:
> require 'evil'
> class A
> def foo;"A";end
> end
> a = A.new
> a.foo # => "A"
> # first level "cut"
> class B < A.clone # need a clone to prevent a loop
> def foo;"["+super+"]";end
> end
> A.become(B) # replace parent with subclass
> a.foo # => "[A]"
> # second level "cut"
> class C < A.clone
> def foo;"{"+super+"}";end
> end
> A.become(C)
> a.foo # => "{[A]}"
> # restore the original functionality
> A.become(B.superclass)
> a.foo # => "A"
> module Brackets
> def foo;"["+super+"]";end
> end
> # "preclude"-like functionality
> class D < A.clone
> include Brackets
> end
> A.become(D)
> a.foo # => "[A]"
> Of course if we had this, it would be better to have a safer
> Class#replace and that be able to break circular loops
> automatically instead of having to use #clone to break the loop
> manually.
Ah yes, this is what I expected. We have been there you know. There's a reason why we've got a C version of
Florian's Object#become method on the Suby page. The problem with this
version is that A has become B. This means that the code that previously
defined, redefined and undefined methods in the original A, does that in B
now. The problem is that it is not possible to add a wrapper class this
way without breaking existing code, or at least without that code messing
with your advice. The behavior is almost the same, except that code needs
to be adapted to use these wrapper classes, and the basic idea behind AOP
is that that should *not* be so. We used this as an early test, but in the
end it had to go because it is obtrusive.
I'm sorry, but we're two years ahead of you you know.