Use with_meta in Moose, Moose::Role, and docs (rather than with_caller)
[gitmo/Moose.git] / lib / Moose / Cookbook / Extending / Recipe4.pod
index 1f046ab..09e2b26 100644 (file)
@@ -9,39 +9,43 @@ Moose::Cookbook::Extending::Recipe4 - Acting like Moose.pm and providing sugar M
 
   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'],
+      also      => 'Moose',
   );
 
   sub init_meta {
       shift;
-      Moose->init_meta( @_, metaclass => 'MyApp::Meta::Class' );
+      return 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;
+  use Moose;
+
+  extends 'Moose::Meta::Class';
+
+  has 'table' => ( is => 'rw' );
+
 =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()>.
+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;>>.
@@ -69,6 +73,11 @@ interface. Here's what it would look like in actual use:
 All of the normal Moose sugar (C<has()>, C<with()>, etc) is available
 when you C<use 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.
+
 =head1 AUTHOR
 
 Dave Rolsky E<lt>autarch@urth.orgE<gt>
@@ -82,4 +91,28 @@ 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.
 
+=begin testing
+
+
+{
+    package MyApp::User;
+
+    MyApp::Mooseish->import;
+
+    has_table( 'User' );
+
+    has( 'username' => ( is => 'ro' ) );
+    has( 'password' => ( is => 'ro' ) );
+
+    sub login { }
+}
+
+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' );
+
+=end testing
+
 =pod