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.