X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMooseX%2FStrictConstructor.pm;h=1f58bb196fd0f32e98a5c8dca578f933ac5ef707;hb=e42c83ec7160e7db57f85cbefd69218fc704abef;hp=c5bab4e6fad20bf74a11faaf5fd719c46f94efb2;hpb=8d7ba9ea782c19f98cbaa4131d900205910f9433;p=gitmo%2FMooseX-StrictConstructor.git diff --git a/lib/MooseX/StrictConstructor.pm b/lib/MooseX/StrictConstructor.pm index c5bab4e..1f58bb1 100644 --- a/lib/MooseX/StrictConstructor.pm +++ b/lib/MooseX/StrictConstructor.pm @@ -3,16 +3,18 @@ package MooseX::StrictConstructor; use strict; use warnings; -our $VERSION = '0.06_01'; +our $VERSION = '0.07'; $VERSION = eval $VERSION; use Class::MOP (); -use Moose (); +use Moose 0.56 (); 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' ); + +Moose::Exporter->setup_import_methods(); sub init_meta { @@ -23,41 +25,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(); } @@ -76,7 +54,8 @@ MooseX::StrictConstructor - Make your object constructors blow up on unknown att package My::Class; - use MooseX::StrictConstructor; # instead of use Moose + use Moose; + use MooseX::StrictConstructor; has 'size' => ...; @@ -87,22 +66,21 @@ MooseX::StrictConstructor - Make your object constructors blow up on unknown att =head1 DESCRIPTION -Using this class to load Moose instead of just loading using Moose -itself 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. +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 accept a parameter to the constructor -that is not the name of an attribute. - -In that case, you'll probably be writing a C method to deal -with it. Your C 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 or +C method to deal with that parameter. In a C +method, you can simply make sure that this parameter is not included +in the hash reference you return. Otherwise, in a C method, +you can delete it from the hash reference of parameters. sub BUILD { my $self = shift; @@ -113,13 +91,6 @@ seen when this class does its checking. } } -=head2 Caveats - -Using this class replaces the default Moose meta class, -C, with its own, -C. If you have your own meta -class, this distro will probably not work for you. - =head1 AUTHOR Dave Rolsky, C<< >> @@ -134,7 +105,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.