use newer MetaRole API and require Moose 0.94
[gitmo/MooseX-StrictConstructor.git] / lib / MooseX / StrictConstructor.pm
index 3be669a..5fb6d8c 100644 (file)
@@ -3,26 +3,41 @@ package MooseX::StrictConstructor;
 use strict;
 use warnings;
 
-our $VERSION = '0.01';
+our $VERSION = '0.08';
+$VERSION = eval $VERSION;
 
-use Moose;
-use MooseX::Object::StrictConstructor;
+use Moose 0.94 ();
+use Moose::Exporter;
+use Moose::Util::MetaRole;
+use MooseX::StrictConstructor::Role::Object;
+use MooseX::StrictConstructor::Role::Meta::Method::Constructor;
 
+Moose::Exporter->setup_import_methods();
 
-sub import
-{
-    my $caller = caller();
+sub init_meta {
+    shift;
+    my %p = @_;
 
-    return if $caller eq 'main';
+    Moose->init_meta(%p);
 
-    Moose::init_meta( $caller, 'MooseX::Object::StrictConstructor', 'Moose::Meta::Class' );
+    my $caller = $p{for_class};
 
-    Moose->import( { into => $caller } );
-
-    return;
-}
+    Moose::Util::MetaRole::apply_metaroles(
+        for             => $caller,
+        class_metaroles => {
+            constructor => [
+                'MooseX::StrictConstructor::Role::Meta::Method::Constructor']
+        },
+    );
 
+    Moose::Util::MetaRole::apply_base_class_roles(
+        for => $caller,
+        roles =>
+            ['MooseX::StrictConstructor::Role::Object'],
+    );
 
+    return $caller->meta();
+}
 
 1;
 
@@ -32,23 +47,48 @@ __END__
 
 =head1 NAME
 
-MooseX::StrictConstructor - The fantastic new MooseX::StrictConstructor!
+MooseX::StrictConstructor - Make your object constructors blow up on unknown attributes
 
 =head1 SYNOPSIS
 
-XXX - change this!
+    package My::Class;
 
+    use Moose;
     use MooseX::StrictConstructor;
 
-    my $foo = MooseX::StrictConstructor->new();
+    has 'size' => ...;
+
+    # then later ...
 
-    ...
+    # this blows up because color is not a known attribute
+    My::Class->new( size => 5, color => 'blue' );
 
 =head1 DESCRIPTION
 
-=head1 METHODS
+Simply loading this module makes your constructors "strict". If your
+constructor is called with an attribute init argument that your class
+does not declare, then it calls "Carp::confess()". This is a great way
+to catch small typos.
+
+=head2 Subverting Strictness
+
+You may find yourself wanting to have your constructor accept a
+parameter which does not correspond to an attribute.
+
+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;
+      my $params = shift;
 
-This class provides the following methods
+      if ( delete $params->{do_something} ) {
+          ...
+      }
+  }
 
 =head1 AUTHOR
 
@@ -56,14 +96,15 @@ Dave Rolsky, C<< <autarch@urth.org> >>
 
 =head1 BUGS
 
-Please report any bugs or feature requests to C<bug-moosex-strictconstructor@rt.cpan.org>,
-or through the web interface at L<http://rt.cpan.org>.  I will be
-notified, and then you'll automatically be notified of progress on
-your bug as I make changes.
+Please report any bugs or feature requests to
+C<bug-moosex-strictconstructor@rt.cpan.org>, or through the web
+interface at L<http://rt.cpan.org>.  I will be notified, and then
+you'll automatically be notified of progress on your bug as I make
+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.