=pod =begin testing-SETUP use Test::Requires { 'Test::Output' => '0', }; =end testing-SETUP =head1 NAME Moose::Cookbook::Extending::Recipe2 - Providing a role for the base object class =head1 SYNOPSIS package MooseX::Debugging; use Moose::Exporter; Moose::Exporter->setup_import_methods( base_class_roles => ['MooseX::Debugging::Role::Object'], ); package MooseX::Debugging::Role::Object; use Moose::Role; after 'BUILDALL' => sub { my $self = shift; warn "Made a new " . ( ref $self ) . " object\n"; }; =head1 DESCRIPTION In this example, we provide a role for the base object class that adds some simple debugging output. Every time an object is created, it spits out a warning saying what type of object it was. Obviously, a real debugging role would do something more interesting, but this recipe is all about how we apply that role. In this case, with the combination of L and L, we ensure that when a module does C>, it automatically gets the debugging role applied to its base object class. There are a few pieces of code worth looking at more closely. Moose::Exporter->setup_import_methods( base_class_roles => ['MooseX::Debugging::Role::Object'], ); This creates an C method in the C package. Since we are not actually exporting anything, we do not pass C any parameters related to exports, but we need to have an C method to ensure that our C method is called. The C is created by C for us, since we passed the C parameter. The generated C will in turn call L. =head1 AUTHOR Dave Rolsky Eautarch@urth.orgE =head1 COPYRIGHT AND LICENSE Copyright 2009-2010 by Infinity Interactive, Inc. L This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =begin testing { package Debugged; use Moose; MooseX::Debugging->import; } stderr_is( sub { Debugged->new }, "Made a new Debugged object\n", 'got expected output from debugging role' ); =end testing =cut