From: Dave Rolsky Date: Mon, 25 Aug 2008 15:56:58 +0000 (+0000) Subject: Rewrite and rename to use Moose::Util::MetaRole, and update the docs X-Git-Tag: 0.06_01~3 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=gitmo%2FMooseX-StrictConstructor.git;a=commitdiff_plain;h=fbfaa61fd77d92711dd73a1022571b0d09166c88 Rewrite and rename to use Moose::Util::MetaRole, and update the docs accordingly. --- diff --git a/lib/MooseX/StrictConstructor.pm b/lib/MooseX/StrictConstructor.pm index c5bab4e..c2bdb35 100644 --- a/lib/MooseX/StrictConstructor.pm +++ b/lib/MooseX/StrictConstructor.pm @@ -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 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 +89,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 +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. diff --git a/lib/MooseX/StrictConstructor/Role/Constructor.pm b/lib/MooseX/StrictConstructor/Role/Meta/Method/Constructor.pm similarity index 68% rename from lib/MooseX/StrictConstructor/Role/Constructor.pm rename to lib/MooseX/StrictConstructor/Role/Meta/Method/Constructor.pm index 54820df..3351738 100644 --- a/lib/MooseX/StrictConstructor/Role/Constructor.pm +++ b/lib/MooseX/StrictConstructor/Role/Meta/Method/Constructor.pm @@ -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 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) so that immutable classes have a +strict constructor. =head1 AUTHOR @@ -65,7 +63,7 @@ Dave Rolsky, C<< >> =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 index 464924b..0000000 --- a/lib/MooseX/StrictConstructor/Role/Metaclass.pm +++ /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 in -C to use -C as the -constructor class. - -You should never have to use this class directly. - -=head1 AUTHOR - -Dave Rolsky, C<< >> - -=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 diff --git a/lib/MooseX/StrictConstructor/Role/Object.pm b/lib/MooseX/StrictConstructor/Role/Object.pm index cefb342..1f23b6e 100644 --- a/lib/MooseX/StrictConstructor/Role/Object.pm +++ b/lib/MooseX/StrictConstructor/Role/Object.pm @@ -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, your objects will subclass this class -rather than Moose::Object. +When you use C, your objects will have this +role applied to them. It provides a method modifier for C +from C that implements strict argument checking for +your class. =head1 AUTHOR @@ -52,7 +53,7 @@ Dave Rolsky, C<< >> =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.