logo
Free, unlimited AI code reviews that run on commit
git-lrc git-lrc GitHub Install Now We'd appreciate a star git-lrc - Free, unlimited AI code reviews that run on commit | Product Hunt git-lrc - Free, unlimited AI code reviews that run on commit | Product Hunt

Aspect::Modular - First generation base class for reusable aspects

Authors

       Adam Kennedy <adamk@cpan.org>

       Marcel Grünauer <marcel@cpan.org>

       Ran Eilam <eilara@cpan.org>

Description

       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 templatemethod:
       "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:

       •   Install advice on pointcuts specified by the caller

       •   Push (vs. OOP pull) subs and base classes into classes specified by the caller

Name

       Aspect::Modular - First generation base class for reusable aspects

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

See Also