[Moose-commits] r7626 - Moose/trunk/lib/Moose/Cookbook/Meta
autarch at code2.0beta.co.uk
autarch at code2.0beta.co.uk
Thu Feb 12 16:06:12 GMT 2009
Author: autarch
Date: 2009-02-12 08:06:12 -0800 (Thu, 12 Feb 2009)
New Revision: 7626
Modified:
Moose/trunk/lib/Moose/Cookbook/Meta/Recipe5.pod
Log:
Revised meta recipe 5
Modified: Moose/trunk/lib/Moose/Cookbook/Meta/Recipe5.pod
===================================================================
--- Moose/trunk/lib/Moose/Cookbook/Meta/Recipe5.pod 2009-02-12 16:01:25 UTC (rev 7625)
+++ Moose/trunk/lib/Moose/Cookbook/Meta/Recipe5.pod 2009-02-12 16:06:12 UTC (rev 7626)
@@ -25,18 +25,16 @@
=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.
+This recipe takes the metaclass table attribute from
+L<Moose::Cookbook::Meta::Recipe4> and mplements it as a metaclass
+trait. Traits are just roles, as we saw in
+L<Moose::Cookbook::Meta::Recipe3>.
The advantage of using traits is that it's easy to combine multiple
-traits, whereas combining multiple metaclasses can be tricky (which
-subclasses which?).
+traits, whereas combining multiple metaclass subclasses requires
+creating yet another subclass. With traits, Moose takes care of
+applying them to your metaclass.
-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
@@ -44,6 +42,24 @@
my $table = MyApp::User->meta->table;
+ # the safe version
+ $table = MyApp::User->meta->table
+ if MyApp::User->meta->meta->can('does')
+ and MyApp::User->meta->meta->does('MyApp::Meta::Class');
+
+The safe version is a little complicated. We have to check that the
+metaclass object's metaclass has a C<does> method, in which case we
+can ask if the the metaclass does a given role.
+
+It's simpler to just write:
+
+ $table = MyApp::User->meta->table
+ if MyApp::User->meta->can('table');
+
+In theory, this is a little less correct, since the metaclass might be
+getting its C<table> method from a I<different> role. In practice, you
+are unlikely to encounter this sort of problem.
+
=head1 SEE ALSO
L<Moose::Cookbook::Meta::Recipe3> - Labels implemented via attribute
More information about the Moose-commits
mailing list