The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

MooseX::ModifyTaggedMethods - use sub attributes to specify which methods want modifiers

SYNOPSIS

   {
      package Local::Role::Transactions;
      
      use MooseX::RoleQR;
      use MooseX::ModifyTaggedMethods;
      
      before methods_tagged('Database') => sub {
         my $self = shift;
         $self->dbh->do('BEGIN TRANSACTION');
      };
      
      after methods_tagged('Database') => sub {
         my $self = shift;
         $self->dbh->do('COMMIT');
      };
   }
   
   {
      package Local::BankAccount;
      
      use Sub::Talisman qw( Database );
      use Moose;
      with qw( Local::Role::Transactions );
      
      has dbh => (is => 'ro', isa => 'Object');
      
      sub transfer_funds : Database {
         my ($self, $amount, $destination) = @_;
         
         # lots of database activity
         ...;
      }
      
      sub withdraw : Database { ... }
      sub deposit  : Database { ... }
   }

DESCRIPTION

Normally Moose classes can specify method modifiers by name, an arrayref of names, or via a regular expression. Moose roles are more limited, not allowing regular expressions.

MooseX::RoleQR extends the functionality for roles, allowing them to use regular expressions to specify method modifiers. MooseX::ModifyTaggedMethods goes even further, allowing classes and roles to use attributes (in the perlsub sense of the word) to indicate which methods should be wrapped.

methods_tagged(@tags)

This module exports a single function methods_tagged which can be used in conjunction with before, after and around to select methods for modifying. What exactly it returns is best you don't know, but it suffices to say that Moose and MooseX::RoleQR (but not plain Moose::Role) know what to do with it.

Note that Perl does not allow you to use any old attribute without first declaring it:

 $ perl -MTest::More=no_plan -E'sub X :Y { }; ok(1)'
 Invalid CODE attribute: Y at -e line 1.
 BEGIN failed--compilation aborted at -e line 1.
 # Looks like your test exited with 255 before it could output anything.

Sub::Talisman provides an easy way of declaring attributes:

 $ perl -MSub::Talisman=Y -MTest::More=no_plan -E'sub X :Y { }; ok(1)'
 ok 1
 1..1

Sub::Talisman is used in the documentation and test cases for MooseX::ModifyTaggedMethods, but any other technique that supports attributes::get($coderef) will do.

BUGS

Test suite mysteriously seems to fail using forkprove.

Please report any bugs to http://rt.cpan.org/Dist/Display.html?Queue=MooseX-ModifyTaggedMethods.

SEE ALSO

Moose, MooseX::RoleQR.

Sub::Talisman, Sub::Talisman::Struct, perlsub, attributes.

AUTHOR

Toby Inkster <tobyink@cpan.org>.

COPYRIGHT AND LICENCE

This software is copyright (c) 2012-2013 by Toby Inkster.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.

DISCLAIMER OF WARRANTIES

THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.