| Aspect documentation | Contained in the Aspect distribution. |
Aspect::Modular - 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 aspect() sub exported
by Aspect|::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 Aspect::Advice 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:
Adam Kennedy <adamk@cpan.org>
Marcel Grünauer <marcel@cpan.org>
Ran Eilam <eilara@cpan.org>
Copyright 2001 by Marcel Grünauer
Some parts copyright 2009 - 2011 Adam Kennedy.
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
| Aspect documentation | Contained in the Aspect distribution. |
package Aspect::Modular; use strict; use warnings; use Aspect::Library (); our $VERSION = '1.01'; our @ISA = 'Aspect::Library'; sub new { my $class = shift; my $self = bless { @_ }, $class; # Generate the appropriate advice $self->{advice} = [ $self->get_advice( $self->args ) ]; # Warn if the aspect is supposed to be permanent, # but the advice isn't created as permanent. if ( $self->lexical ) { if ( grep { not $_->lexical } @{$self->{advice}} ) { warn("$class creates lexical advice for global aspects"); } } else { if ( grep { $_->lexical } @{$self->{advice}} ) { warn("$class creates global advice for lexical aspects"); } } return $self; } sub args { @{$_[0]->{args}}; } sub lexical { $_[0]->{lexical}; } sub get_advice { my $class = ref $_[0] || $_[0]; die("Method 'get_advice' is not implemented by class '$class'"); } ###################################################################### # Optional XS Acceleration BEGIN { local $@; eval <<'END_PERL'; use Class::XSAccessor 1.08 { replace => 1, getters => { 'lexical' => 'lexical', }, }; END_PERL } 1; __END__