Rename Meta::Recipe5 to Meta::Table_MetaclassTrait
[gitmo/Moose.git] / lib / Moose / Cookbook / Extending / Recipe4.pod
index 1f046ab..0509279 100644 (file)
@@ -1,50 +1,49 @@
+package Moose::Cookbook::Extending::Recipe4;
 
-=pod
+# ABSTRACT: Acting like Moose.pm and providing sugar Moose-style
+
+__END__
 
-=head1 NAME
 
-Moose::Cookbook::Extending::Recipe4 - Acting like Moose.pm and providing sugar Moose-style
+=pod
 
 =head1 SYNOPSIS
 
   package MyApp::Mooseish;
 
-  use strict;
-  use warnings;
-
-  use Moose ();
   use Moose::Exporter;
 
   Moose::Exporter->setup_import_methods(
-      with_caller => ['has_table'],
-      also        => 'Moose',
+      with_meta       => ['has_table'],
+      class_metaroles => {
+          class => ['MyApp::Meta::Class::Trait::HasTable'],
+      },
   );
 
-  sub init_meta {
-      shift;
-      Moose->init_meta( @_, metaclass => 'MyApp::Meta::Class' );
-  }
-
   sub has_table {
-      my $caller = shift;
-      $caller->meta()->table(shift);
+      my $meta = shift;
+      $meta->table(shift);
   }
 
+  package MyApp::Meta::Class::Trait::HasTable;
+  use Moose::Role;
+
+  has table => (
+      is  => 'rw',
+      isa => 'Str',
+  );
+
 =head1 DESCRIPTION
 
 This recipe expands on the use of L<Moose::Exporter> we saw in
-L<Moose::Cookbook::Extending::Recipe1>. Instead of providing our own
-object base class, we provide our own metaclass class, and we also
-export a sugar subroutine C<has_table()>.
+L<Moose::Cookbook::Extending::Recipe1> and the class metaclass trait we saw in
+L<Moose::Cookbook::Meta::Table_MetaclassTrait>. In this example we provide our
+own metaclass trait, and we also export a C<has_table> sugar function.
 
-Given the above code, you can now replace all instances of C<use
-Moose> with C<use MyApp::Mooseish>. Similarly, C<no Moose> is now
-replaced with C<no MyApp::Mooseish>.
-
-The C<with_caller> parameter specifies a list of functions that should
+The C<with_meta> parameter specifies a list of functions that should
 be wrapped before exporting. The wrapper simply ensures that the
-importing package name is the first argument to the function, so we
-can do C<S<my $caller = shift;>>.
+importing package's appropriate metaclass object is the first argument
+to the function, so we can do C<S<my $meta = shift;>>.
 
 See the L<Moose::Exporter> docs for more details on its API.
 
@@ -55,6 +54,9 @@ interface. Here's what it would look like in actual use:
 
   package MyApp::User;
 
+  use namespace::autoclean;
+
+  use Moose;
   use MyApp::Mooseish;
 
   has_table 'User';
@@ -64,22 +66,33 @@ interface. Here's what it would look like in actual use:
 
   sub login { ... }
 
-  no MyApp::Mooseish;
+=head1 CONCLUSION
+
+Providing sugar functions can make your extension look much more
+Moose-ish. See L<Fey::ORM> for a more extensive example.
+
+=begin testing
+
 
-All of the normal Moose sugar (C<has()>, C<with()>, etc) is available
-when you C<use MyApp::Mooseish>.
+{
+    package MyApp::User;
 
-=head1 AUTHOR
+    MyApp::Mooseish->import;
 
-Dave Rolsky E<lt>autarch@urth.orgE<gt>
+    has_table( 'User' );
 
-=head1 COPYRIGHT AND LICENSE
+    has( 'username' => ( is => 'ro' ) );
+    has( 'password' => ( is => 'ro' ) );
 
-Copyright 2006-2009 by Infinity Interactive, Inc.
+    sub login { }
+}
 
-L<http://www.iinteractive.com>
+isa_ok( MyApp::User->meta, 'MyApp::Meta::Class' );
+is( MyApp::User->meta->table, 'User',
+    'MyApp::User->meta->table returns User' );
+ok( MyApp::User->can('username'),
+    'MyApp::User has username method' );
 
-This library is free software; you can redistribute it and/or modify
-it under the same terms as Perl itself.
+=end testing
 
 =pod