X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMoose%2FCookbook%2FExtending%2FRecipe3.pod;h=544a86f9b143b3bf288916104a4a6c91be569ca5;hb=a8de959b06fd55b27f3de7ab7da763729916a6c2;hp=3abe740d1f8ed0ccd69cbdaf600eedbbf382253f;hpb=e606ae5f848070d889472329819c95f5ba763ca3;p=gitmo%2FMoose.git diff --git a/lib/Moose/Cookbook/Extending/Recipe3.pod b/lib/Moose/Cookbook/Extending/Recipe3.pod index 3abe740..544a86f 100644 --- a/lib/Moose/Cookbook/Extending/Recipe3.pod +++ b/lib/Moose/Cookbook/Extending/Recipe3.pod @@ -1,6 +1,19 @@ =pod +=begin testing-SETUP + +BEGIN { + eval 'use Test::Warn 0.11;'; + if ($@) { + diag 'Test::Warn 0.11+ is required for this test'; + ok(1); + exit 0; + } +} + +=end testing-SETUP + =head1 NAME Moose::Cookbook::Extending::Recipe3 - Providing an alternate base object class @@ -24,34 +37,33 @@ Moose::Cookbook::Extending::Recipe3 - Providing an alternate base object class sub init_meta { shift; - Moose->init_meta( @_, base_class => 'MyApp::Object' ); + return Moose->init_meta( @_, base_class => 'MyApp::Base' ); } =head1 DESCRIPTION -Often you find that you want to share some behavior between all your -classes. One way to do that is to make a base class and simply add -C> to every class in your -application. However, that can get tedious. Instead, you can simply -create your Moose-alike module that sets the base object class to -C for you. +A common extension is to provide an alternate base class. One way to +do that is to make a C and add C> 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 C for you. Then, instead of writing C> you can write C>. In this particular example, our base class issues some debugging -output every time a new object is created, but you can surely think of -some more interesting things to do with your own base class. +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 all works because of the magic of L. When we -call C<< Moose::Exporter->setup_import_methods( also => 'Moose' ) >> -it builds an C and C method for you. The C<< also => -'Moose' >> bit says that we want to export everything that Moose does. +This uses the magic of L. When we call C<< +Moose::Exporter->setup_import_methods( also => 'Moose' ) >> it builds +C and C methods for you. The C<< also => 'Moose' >> +bit says that we want to export everything that Moose does. The C method that gets created will call our C -method, passing it C<< for_caller => $caller >> as its arguments. The -C<$caller> is set to the class that actually imported us in the first -place. +method, passing it C<< for_caller => $caller >> as its +arguments. The C<$caller> is set to the class that actually imported +us in the first place. See the L docs for more details on its API. @@ -69,17 +81,48 @@ class. no MyApp::UseMyBase; +=head1 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. + =head1 AUTHOR Dave Rolsky Eautarch@urth.orgE =head1 COPYRIGHT AND LICENSE -Copyright 2006-2008 by Infinity Interactive, Inc. +Copyright 2006-2009 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 Foo; + + MyApp::UseMyBase->import; + + has( 'size' => ( is => 'rw' ) ); +} + +ok( Foo->isa('MyApp::Base'), 'Foo isa MyApp::Base' ); + +ok( Foo->can('size'), 'Foo has a size method' ); + +my $foo; +warning_is( + sub { $foo = Foo->new( size => 2 ) }, + 'Making a new Foo', + 'got expected warning when calling Foo->new' +); + +is( $foo->size(), 2, '$foo->size is 2' ); + +=end testing + =cut