First generation base class for reusable aspects
# Subclassing to create a reusable aspect
package Aspect::Library::ConstructorTracer;
use strict;
use base 'Aspect::Modular';
use Aspect::Advice::After ();
sub get_advice {
my $self = shift;
my $pointcut = shift;
return Aspect::Advice::After->new(
lexical => $self->lexical,
pointcut => $pointcut,
code => sub {
print 'Created object: ' . shift->return_value . "\n";
},
);
}
# 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 \*(C`aspect()\*(C' sub exported by Aspect. You call \*(C`aspect()\*(C' with the class name of the reusable aspect (it must exist in the package \*(C`Aspect::Library\*(C'), 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: \*(C`get_advice()\*(C'. It is called with all the parameters that were sent when user code created the aspect, and is expected to return Aspect::Advice object/s, that will be installed while the reusable aspect is still in scope. If the \*(C`aspect()\*(C' 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. \s-1OOP\s0 pull) subs and base classes into classes specified by the caller
Copyright 2001 by Marcel Gru\*:nauer
Some parts copyright 2009 - 2013 Adam Kennedy.
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.