Rewrite and rename to use Moose::Util::MetaRole, and update the docs
Dave Rolsky [Mon, 25 Aug 2008 15:56:58 +0000 (15:56 +0000)]
accordingly.

lib/MooseX/StrictConstructor.pm
lib/MooseX/StrictConstructor/Role/Meta/Method/Constructor.pm [moved from lib/MooseX/StrictConstructor/Role/Constructor.pm with 68% similarity]
lib/MooseX/StrictConstructor/Role/Metaclass.pm [deleted file]
lib/MooseX/StrictConstructor/Role/Object.pm

index c5bab4e..c2bdb35 100644 (file)
@@ -9,8 +9,9 @@ $VERSION = eval $VERSION;
 use Class::MOP ();
 use Moose ();
 use Moose::Exporter;
+use Moose::Util::MetaRole;
 use MooseX::StrictConstructor::Role::Object;
-use MooseX::StrictConstructor::Role::Metaclass;
+use MooseX::StrictConstructor::Role::Meta::Method::Constructor;
 
 Moose::Exporter->setup_import_methods( also => 'Moose' );
 
@@ -23,41 +24,17 @@ sub init_meta
 
     my $caller = $p{for_class};
 
-    my $old_meta = $caller->meta();
-
-    my $metameta = $old_meta->meta();
-    unless ( $metameta->can('does_role')
-             && $metameta->does_role( 'MooseX::StrictConstructor::Role::Metaclass' ) )
-    {
-        my $new_meta =
-            Moose::Meta::Class->create_anon_class
-                ( superclasses => [ ref $caller->meta() ],
-                  roles        => [ 'MooseX::StrictConstructor::Role::Metaclass' ],
-                  cache        => 1,
-                );
-
-        Class::MOP::remove_metaclass_by_name($caller);
-
-        $new_meta->name()->initialize( $caller,
-                                       map { $_ => $old_meta->$_() }
-                                       qw( attribute_metaclass
-                                           method_metaclass
-                                           instance_metaclass
-                                         )
-                                     );
-    }
-
-    unless ( $caller->meta()->does_role('MooseX::StrictConstructor::Role::Object') )
-    {
-        my $new_base =
-            Moose::Meta::Class->create_anon_class
-                ( superclasses => [ $caller->meta()->superclasses() ],
-                  roles        => [ 'MooseX::StrictConstructor::Role::Object' ],
-                  cache        => 1,
-                );
-
-        $caller->meta()->superclasses( $new_base->name() );
-    }
+    Moose::Util::MetaRole::apply_metaclass_roles
+        ( for_class => $caller,
+          constructor_class_roles =>
+          ['MooseX::StrictConstructor::Role::Meta::Method::Constructor'],
+        );
+
+    Moose::Util::MetaRole::apply_base_class_roles
+        ( for_class => $caller,
+          roles =>
+          [ 'MooseX::StrictConstructor::Role::Object' ],
+        );
 
     return $caller->meta();
 }
@@ -94,15 +71,14 @@ it calls "Carp::confess()". This is a great way to catch small typos.
 
 =head2 Subverting Strictness
 
-You may find yourself wanting to accept a parameter to the constructor
-that is not the name of an attribute.
-
-In that case, you'll probably be writing a C<BUILD()> method to deal
-with it. Your C<BUILD()> method will receive two parameters, the new
-object, and a hash reference of parameters passed to the constructor.
+You may find yourself wanting to have your constructor accept a
+parameter which does not correspond to an attribute.
 
-If you delete keys from this hash reference, then they will not be
-seen when this class does its checking.
+In that case, you'll probably also be writing a C<BUILD()> or
+C<BUILDARGS()> method to deal with that parameter. In a C<BUILDARGS()>
+method, you can simply make sure that this parameter is not included
+in the hash reference you return. Otherwise, in a C<BUILD()> method,
+you can delete it from the hash reference of parameters.
 
   sub BUILD {
       my $self   = shift;
@@ -113,13 +89,6 @@ seen when this class does its checking.
       }
   }
 
-=head2 Caveats
-
-Using this class replaces the default Moose meta class,
-C<Moose::Meta::Class>, with its own,
-C<MooseX::StrictConstructor::Meta::Class>. If you have your own meta
-class, this distro will probably not work for you.
-
 =head1 AUTHOR
 
 Dave Rolsky, C<< <autarch@urth.org> >>
@@ -134,7 +103,7 @@ changes.
 
 =head1 COPYRIGHT & LICENSE
 
-Copyright 2007 Dave Rolsky, All Rights Reserved.
+Copyright 2007-2008 Dave Rolsky, All Rights Reserved.
 
 This program is free software; you can redistribute it and/or modify
 it under the same terms as Perl itself.
@@ -1,4 +1,4 @@
-package MooseX::StrictConstructor::Role::Constructor;
+package MooseX::StrictConstructor::Role::Meta::Method::Constructor;
 
 use strict;
 use warnings;
@@ -45,7 +45,7 @@ __END__
 
 =head1 NAME
 
-MooseX::StrictConstructor::Meta::Method::Constructor - A meta class to make immutable constructors strict
+MooseX::StrictConstructor::Role::Meta::Method::Constructor - A role to make immutable constructors strict
 
 =head1 SYNOPSIS
 
@@ -53,11 +53,9 @@ MooseX::StrictConstructor::Meta::Method::Constructor - A meta class to make immu
 
 =head1 DESCRIPTION
 
-This class simply overrides C<_generate_BUILDALL()> in
-C<Moose::Meta::Method::Constructor> so that classes that are made
-immutable have a strict constructor.
-
-You should never have to use this class directly.
+This role simply wraps C<_generate_BUILDALL()> (from
+C<Moose::Meta::Method::Constructor>) so that immutable classes have a
+strict constructor.
 
 =head1 AUTHOR
 
@@ -65,7 +63,7 @@ Dave Rolsky, C<< <autarch@urth.org> >>
 
 =head1 COPYRIGHT & LICENSE
 
-Copyright 2007 Dave Rolsky, All Rights Reserved.
+Copyright 2007-2008 Dave Rolsky, All Rights Reserved.
 
 This program is free software; you can redistribute it and/or modify
 it under the same terms as Perl itself.
diff --git a/lib/MooseX/StrictConstructor/Role/Metaclass.pm b/lib/MooseX/StrictConstructor/Role/Metaclass.pm
deleted file mode 100644 (file)
index 464924b..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-package MooseX::StrictConstructor::Role::Metaclass;
-
-use strict;
-use warnings;
-
-use MooseX::StrictConstructor::Role::Constructor;
-
-use Moose::Role;
-
-has 'constructor_class' =>
-    ( is         => 'ro',
-      isa        => 'ClassName',
-      lazy_build => 1,
-    );
-
-sub _build_constructor_class
-{
-    return
-        Moose::Meta::Class->create_anon_class
-            ( superclasses => [ 'Moose::Meta::Method::Constructor' ],
-              roles        => [ 'MooseX::StrictConstructor::Role::Constructor' ],
-              cache        => 1,
-            )->name();
-}
-
-# If Moose::Meta::Class had a constructor_class attribute, this
-# wrapper would not be necessary.
-around 'make_immutable' => sub
-{
-    my $orig = shift;
-    my $self = shift;
-
-    return
-        $self->$orig
-            ( constructor_class => $self->constructor_class(),
-              @_,
-            );
-};
-
-no Moose::Role;
-
-
-1;
-
-__END__
-
-=pod
-
-=head1 NAME
-
-MooseX::StrictConstructor::Meta::Class - A meta class for classes with strict constructors
-
-=head1 SYNOPSIS
-
-  use MooseX::StrictConstructor;
-
-=head1 DESCRIPTION
-
-This class simply overrides C<make_immutable()> in
-C<Moose::Meta::Class> to use
-C<MooseX::StrictConstructor::Meta::Method::Constructor> as the
-constructor class.
-
-You should never have to use this class directly.
-
-=head1 AUTHOR
-
-Dave Rolsky, C<< <autarch@urth.org> >>
-
-=head1 COPYRIGHT & LICENSE
-
-Copyright 2007 Dave Rolsky, All Rights Reserved.
-
-This program is free software; you can redistribute it and/or modify
-it under the same terms as Perl itself.
-
-=cut
index cefb342..1f23b6e 100644 (file)
@@ -38,13 +38,14 @@ __END__
 
 =head1 NAME
 
-MooseX::Object::StrictConstructor - Implements strict constructors as a Moose::Object subclass
+MooseX::StrictConstructor::Role::Object - A role which implements a stricto constructor for Moose::Object
 
 =head1 DESCRIPTION
 
-This class has no external interface. When you use
-C<MooseX::StrictConstructor>, your objects will subclass this class
-rather than Moose::Object.
+When you use C<MooseX::StrictConstructor>, your objects will have this
+role applied to them. It provides a method modifier for C<BUILDALL()>
+from C<Moose::Object> that implements strict argument checking for
+your class.
 
 =head1 AUTHOR
 
@@ -52,7 +53,7 @@ Dave Rolsky, C<< <autarch@urth.org> >>
 
 =head1 COPYRIGHT & LICENSE
 
-Copyright 2007 Dave Rolsky, All Rights Reserved.
+Copyright 2007-2008 Dave Rolsky, All Rights Reserved.
 
 This program is free software; you can redistribute it and/or modify
 it under the same terms as Perl itself.