wrote extending recipe2 (role for object base class)
Dave Rolsky [Wed, 27 Aug 2008 15:19:22 +0000 (15:19 +0000)]
lib/Moose/Cookbook.pod
lib/Moose/Cookbook/Extending/Recipe2.pod [new file with mode: 0644]

index 0f106ca..5a9d225 100644 (file)
@@ -175,10 +175,12 @@ There are quite a number of ways to extend Moose. This recipe explains
 provides an overview of each method, and provides recommendations for
 when each is appropriate.
 
-=item L<Moose::Cookbook::Extending::Recipe2> - Providing a base object class role (TODO)
+=item L<Moose::Cookbook::Extending::Recipe2> - Providing a base object class role
 
 Many base object class extensions can be implemented as roles. This
-example shows how to provide a base object class debugging role.
+example shows how to provide a base object class debugging role that
+is applied to any class that uses a notional C<MooseX::Debugging>
+module.
 
 =item L<Moose::Cookbook::Extending::Recipe3> - Providing an alternate base object class
 
diff --git a/lib/Moose/Cookbook/Extending/Recipe2.pod b/lib/Moose/Cookbook/Extending/Recipe2.pod
new file mode 100644 (file)
index 0000000..0bdeae5
--- /dev/null
@@ -0,0 +1,68 @@
+
+=pod
+
+=head1 NAME
+
+Moose::Cookbook::Extending::Recipe2 - Providing a role for the base object class
+
+=head1 SYNOPSIS
+
+  package MooseX::Debugging;
+
+  use strict;
+  use warnings;
+
+  use Moose::Exporter;
+  use Moose::Util::MetaRole;
+  use MooseX::Debugging::Role::Object;
+
+  Moose::Exporter->setup_import_methods();
+
+  sub init_meta {
+      shift;
+      my %options = @_;
+
+      Moose::Util::MetaRole::apply_base_object_roles(
+          for_class => $options{for_class},
+          role      => ['MooseX::Debugging::Role::Object'],
+      );
+  }
+
+
+  package MooseX::Debugging::Role::Object;
+
+  after 'BUILD' => sub {
+      my $self = shift;
+
+      warn "Made a new " . ref $self . " object\n";
+  }
+
+=head1 DESCRIPTION
+
+In this example, we provide a role for the base object class that adds
+some simple debugging output. Every time an object is created, it
+spits out a warning saying what type of object it was.
+
+Obviously, a real debugging role would do something more interesting,
+but this recipe is all about how we apply that role.
+
+In this case, with the combination of L<Moose::Exporter> and
+L<Moose::Util::MetaRole>, we ensure that when a module does "S<use
+MooseX::Debugging>", it automatically gets the debugging role applied
+to its base object class.
+
+=head1 AUTHOR
+
+Dave Rolsky E<lt>autarch@urth.orgE<gt>
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright 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.
+
+=cut
+