Linux and UNIX Man Pages

Linux & Unix Commands - Search Man Pages

moose::cookbook::extending::recipe2(3) [osx man page]

Moose::Cookbook::Extending::Recipe2(3)			User Contributed Perl Documentation		    Moose::Cookbook::Extending::Recipe2(3)

NAME
Moose::Cookbook::Extending::Recipe2 - Providing a role for the base object class VERSION
version 2.0205 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 "; }; 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
Stevan Little <stevan@iinteractive.com> COPYRIGHT AND LICENSE
This software is copyright (c) 2011 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.12.5 2011-09-06 Moose::Cookbook::Extending::Recipe2(3)

Check Out this Related Man Page

Moose::Cookbook::Legacy::Debugging_BaseClassReplacement(User Contributed Perl DocumentatMoose::Cookbook::Legacy::Debugging_BaseClassReplacement(3)

NAME
Moose::Cookbook::Legacy::Debugging_BaseClassReplacement - Providing an alternate base object class VERSION
version 2.0604 SYNOPSIS
package MyApp::Base; use Moose; extends 'Moose::Object'; before 'new' => sub { warn "Making a new " . $_[0] }; no Moose; package MyApp::UseMyBase; use Moose (); use Moose::Exporter; Moose::Exporter->setup_import_methods( also => 'Moose' ); sub init_meta { shift; return Moose->init_meta( @_, base_class => 'MyApp::Base' ); } DESCRIPTION
WARNING: Replacing the base class entirely, as opposed to applying roles to the base class, is strongly discouraged. This recipe is provided solely for reference when encountering older code that does this. A common extension is to provide an alternate base class. One way to do that is to make a "MyApp::Base" and add "extends 'MyApp::Base'" to every class in your application. That's pretty tedious. Instead, you can create a Moose-alike module that sets the base object class to "MyApp::Base" for you. Then, instead of writing "use Moose" you can write "use MyApp::UseMyBase". In this particular example, our base class issues some debugging output every time a new object is created, but you can think of some more interesting things to do with your own base class. This uses the magic of Moose::Exporter. When we call "Moose::Exporter->setup_import_methods( also => 'Moose' )" it builds "import" and "unimport" methods for you. The "also => 'Moose'" bit says that we want to export everything that Moose does. The "import" method that gets created will call our "init_meta" method, passing it "for_caller => $caller" as its arguments. The $caller is set to the class that actually imported us in the first place. See the Moose::Exporter docs for more details on its API. NAME
Moose::Cookbook::Extending::Recipe3 - Providing an alternate base object class VERSION
version 2.0402 USING MyApp::UseMyBase To actually use our new base class, we simply use "MyApp::UseMyBase" instead of "Moose". We get all the Moose sugar plus our new base class. package Foo; use MyApp::UseMyBase; has 'size' => ( is => 'rw' ); no MyApp::UseMyBase; CONCLUSION
This is an awful lot of magic for a simple base class. You will often want to combine a metaclass trait with a base class extension, and that's when this technique is useful. 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. 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.2 2012-09-19 Moose::Cookbook::Legacy::Debugging_BaseClassReplacement(3)
Man Page