Wrote meta recipe 5 - metaclass traits
Dave Rolsky [Tue, 12 Aug 2008 19:32:42 +0000 (19:32 +0000)]
lib/Moose/Cookbook.pod
lib/Moose/Cookbook/Meta/Recipe4.pod
lib/Moose/Cookbook/Meta/Recipe5.pod [new file with mode: 0644]

index ce8763c..3f338e2 100644 (file)
@@ -134,11 +134,12 @@ composable attribute functionality.
 If you want to store more information about your classes, you'll have
 to extend C<Moose::Meta::Class>. Doing so is simple, but you'll
 probably also want to provide some sugar, so see
-L<Moose::Cookbook::Meta::Recipe6> as well.
+L<Moose::Cookbook::Extending::Recipe2> as well.
 
-=item L<Moose::Cookbook::Meta::Recipe5> - The "table" attribute implemented via a metaclass trait
+=item L<Moose::Cookbook::Meta::Recipe5> - The "table" attribute implemented as a metaclass trait
 
-I<abstract goes here>
+This example takes the class metaclass we saw in the previous recipe
+and reimplements it as a metaclass trait.
 
 =item L<Moose::Cookbook::Meta::Recipe6> - Hooking into the immutabilization system (TODO)
 
@@ -177,8 +178,8 @@ functionality to all your classes without typing C<extends
 
 =item L<Moose::Cookbook::Extending::Recipe2> - Acting like Moose.pm and providing sugar Moose-style
 
-This recipe shows how to provide a replacement for C<Moose.pm>. This
-is something that you may want to do as part of a C<MooseX> module,
+This recipe shows how to provide a replacement for C<Moose.pm>. You
+may want to do this as part of the API for a C<MooseX> module,
 especially if you want to default to a new metaclass class or base
 object class.
 
index 17365b6..fbc4593 100644 (file)
@@ -33,7 +33,7 @@ providing some sort of sugar for declaring the table. This is covered
 in L<Moose::Cookbook::Extending::Recipe2>, which shows how to make a
 module like C<Moose.pm> itself, with sugar like C<has_table()>.
 
-=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<MyApp::User>, we could simply write the following:
@@ -46,7 +46,10 @@ its metaclass, this method call just works.
 =head1 SEE ALSO
 
 L<Moose::Cookbook::Meta::Recipe5> - The "table" attribute implemented
-via a metaclass trait
+as a metaclass trait
+
+L<Moose::Cookbook::Extending::Recipe2> - 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 (file)
index 0000000..b0d54b7
--- /dev/null
@@ -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<has_table> 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<Moose::Cookbook::Meta::Recipe4>:
+
+  my $table = MyApp::User->meta()->table();
+
+=head1 SEE ALSO
+
+L<Moose::Cookbook::Meta::Recipe3> - Labels implemented via attribute
+traits
+
+L<Moose::Cookbook::Meta::Recipe4> - Adding a "table" attribute to the
+metaclass
+
+=head1 AUTHOR
+
+Dave Rolsky E<lt>autarch@urth.orgE<gt>
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright 2006-2008 by Infinity Interactive, Inc.
+
+L<http://www.iinteractive.com>
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=pod