Provided by: libmoose-perl_2.1005-1_amd64 bug

NAME

       Moose::Cookbook::Extending::Debugging_BaseClassRole - Providing a role for the base object
       class

VERSION

       version 2.1005

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;

         sub BUILD {}
         after BUILD => sub {
             my $self = shift;

             warn "Made a new " . ( ref $self ) . " object\n";
         };

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 Moose::Exporter and Moose::Util::MetaRole, we ensure
       that when a module does "use MooseX::Debugging", 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 "import" method in the "MooseX::Debugging" package. Since we are not
       actually exporting anything, we do not pass "setup_import_methods" any parameters related
       to exports, but we need to have an "import" method to ensure that our "init_meta" method
       is called. The "init_meta" is created by "setup_import_methods" for us, since we passed
       the "base_class_roles" parameter. The generated "init_meta" will in turn call
       Moose::Util::MetaRole::apply_base_class_roles.

         sub BUILD {}
         after BUILD => sub {
             ...
         };

       Due to the way role composition currently works, if the class that a role is composed into
       contains a "BUILD" method, then that will override the "BUILD" method in any roles it
       composes, which is typically not what you want. Using a method modifier on "BUILD" avoids
       this issue, since method modifiers compose together rather than being overridden. Method
       modifiers require that a method exists in order to wrap, however, so we also provide a
       stub method to wrap if no "BUILD" method exists in the class.

AUTHOR

       Moose is maintained by the Moose Cabal, along with the help of many contributors. See
       "CABAL" in Moose and "CONTRIBUTORS" in Moose for details.

COPYRIGHT AND LICENSE

       This software is copyright (c) 2013 by Infinity Interactive, Inc..

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

perl v5.18.1                             Moose::Cookbook::Extending::Debugging_BaseClassRole(3pm)