From: Dave Rolsky Date: Tue, 12 Aug 2008 19:32:42 +0000 (+0000) Subject: Wrote meta recipe 5 - metaclass traits X-Git-Tag: 0_55_01~35 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=c5b9daec35c1c64d70b4aa28f01a329c062b2e22;p=gitmo%2FMoose.git Wrote meta recipe 5 - metaclass traits --- diff --git a/lib/Moose/Cookbook.pod b/lib/Moose/Cookbook.pod index ce8763c..3f338e2 100644 --- a/lib/Moose/Cookbook.pod +++ b/lib/Moose/Cookbook.pod @@ -134,11 +134,12 @@ composable attribute functionality. If you want to store more information about your classes, you'll have to extend C. Doing so is simple, but you'll probably also want to provide some sugar, so see -L as well. +L as well. -=item L - The "table" attribute implemented via a metaclass trait +=item L - The "table" attribute implemented as a metaclass trait -I +This example takes the class metaclass we saw in the previous recipe +and reimplements it as a metaclass trait. =item L - Hooking into the immutabilization system (TODO) @@ -177,8 +178,8 @@ functionality to all your classes without typing C - Acting like Moose.pm and providing sugar Moose-style -This recipe shows how to provide a replacement for C. This -is something that you may want to do as part of a C module, +This recipe shows how to provide a replacement for C. You +may want to do this as part of the API for a C module, especially if you want to default to a new metaclass class or base object class. diff --git a/lib/Moose/Cookbook/Meta/Recipe4.pod b/lib/Moose/Cookbook/Meta/Recipe4.pod index 17365b6..fbc4593 100644 --- a/lib/Moose/Cookbook/Meta/Recipe4.pod +++ b/lib/Moose/Cookbook/Meta/Recipe4.pod @@ -33,7 +33,7 @@ providing some sort of sugar for declaring the table. This is covered in L, which shows how to make a module like C itself, with sugar like C. -=head2 Using It +=head2 Using this Metaclass in Practice Using this new "table" attribute is quite simple. Let's say we have a class named C, we could simply write the following: @@ -46,7 +46,10 @@ its metaclass, this method call just works. =head1 SEE ALSO L - The "table" attribute implemented -via a metaclass trait +as a metaclass trait + +L - Acting like Moose.pm and +providing sugar Moose-style =head1 AUTHOR diff --git a/lib/Moose/Cookbook/Meta/Recipe5.pod b/lib/Moose/Cookbook/Meta/Recipe5.pod new file mode 100644 index 0000000..b0d54b7 --- /dev/null +++ b/lib/Moose/Cookbook/Meta/Recipe5.pod @@ -0,0 +1,68 @@ + +=pod + +=head1 NAME + +Moose::Cookbook::Meta::Recipe5 - The "table" attribute as a metaclass trait + +=head1 SYNOPSIS + + package MyApp::Meta::Class::Trait::HasTable; + use Moose::Role; + + has table => + ( is => 'rw', + isa => 'Str', + ); + + package Moose::Meta::Class::Custom::Trait::HasTable; + sub register_implementation { 'MyApp::Meta::Class::Trait::HasTable' } + + package MyApp::User; + use Moose -traits => 'HasTable'; + + __PACKAGE__->table('User'); + +=head1 DESCRIPTION + +This recipe takes the metaclass table attribute and reimplements it as +a metaclass trait. Traits are just roles that Moose applies to +something for you. In this case, that "something" is the class's +metaclass object. + +The advantage of using traits is that it's easy to combine multiple +traits, whereas combining multiple metaclasses can be tricky (which +subclasses which?). + +The disadvantage is that it's not easy to combine a trait with some +sort of sugar (like our notional C sugar). + +=head2 Using this Metaclass Trait in Practice + +Once this trait has been applied to a metaclass, it looks exactly like +the example we saw in L: + + my $table = MyApp::User->meta()->table(); + +=head1 SEE ALSO + +L - Labels implemented via attribute +traits + +L - Adding a "table" attribute to the +metaclass + +=head1 AUTHOR + +Dave Rolsky Eautarch@urth.orgE + +=head1 COPYRIGHT AND LICENSE + +Copyright 2006-2008 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. + +=pod