SYNOPSIS

  # 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';

DESCRIPTION

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

AUTHORS

Adam Kennedy <[email protected]>

Marcel Gru\*:nauer <[email protected]>

Ran Eilam <[email protected]>

COPYRIGHT

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.