Aspect::Modular - base class for reusable aspects
# subclassing to create a reusable aspect package Aspect::Library::ConstructorTracer; use Aspect; use base 'Aspect::Modular'; sub get_advice { my ($self, $pointcut) = @_; after { print 'created object: '. shift->return_value. "\n" } $pointcut; }
# using the new aspect package main; use Aspect; # print message when constructing new Person aspect ConstructorTracer => call 'Person::new';
All reusable aspect inherit from this class. Such aspects are created in
user code, using the aspect() sub exported by Aspect. You
call aspect() with the class name of the reusable aspect (it must
exist in the package Aspect::Library), and any parameters (pointcuts,
class names, code to run, etc.) the specific aspect may require.
The Wormhole aspect, for example, expects 2 pointcut specs for the wormhole source and target, while the Profiler aspect expects a pointcut object, to select the subs to be profiled.
You create a reusable aspect by subclassing this class, and providing one
template method: get_advice(). It is called with all the parameters
that were sent when user code created the aspect, and is expected to
return the Aspect::Advice manpage object/s, that will be installed while the
reusable aspect is still in scope. If the aspect() sub is called in
void context, the reusable aspect is installed until class reloading or
interpreter shutdown.
Typical things a reusable aspect may want to do:
Install advice on pointcuts specified by the caller
Push (vs. OOP pull) subs and base classes into classes specified by the caller
See the Aspect pod for a guide to the Aspect module.
You can find examples of reusable aspects in the Aspect::Library
package. the Aspect::Library::Singleton manpage for example.