NAME¶
Moose::Cookbook::Extending::Debugging_BaseClassRole - Providing a role for the
base object class
VERSION¶
version 2.0603
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) 2012 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.