Moose::Cookbook::ExtenUsMoose::Cookbook::Extending::Debugging_BaseClassRole(3)NAME
Moose::Cookbook::Extending::Debugging_BaseClassRole - Providing a role
for the base object class
VERSION
version 2.0604
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.
perl v5.16.2Moose::Cookbook::Extending::Debugging_BaseClassRole(3)