X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMooseX%2FUndefTolerant.pm;h=294e8e4dab64351983f5ea330cf51c572a21b695;hb=15d560276ffd95bfb338efcdb9ea1e5a1492d445;hp=37071415275a8eed7ee703dbf098912a35696d17;hpb=2d1c57bd726cc5ecf2aba441912a9163a74ceb1a;p=gitmo%2FMooseX-UndefTolerant.git diff --git a/lib/MooseX/UndefTolerant.pm b/lib/MooseX/UndefTolerant.pm index 3707141..294e8e4 100644 --- a/lib/MooseX/UndefTolerant.pm +++ b/lib/MooseX/UndefTolerant.pm @@ -1,27 +1,55 @@ package MooseX::UndefTolerant; +use strict; +use warnings; + use Moose qw(); use Moose::Exporter; use MooseX::UndefTolerant::Attribute; +use MooseX::UndefTolerant::Class; use MooseX::UndefTolerant::Constructor; -our $VERSION = '0.04'; -Moose::Exporter->setup_import_methods( - class_metaroles => { - attribute => [ 'MooseX::UndefTolerant::Attribute' ], - constructor => [ 'MooseX::UndefTolerant::Constructor' ], +my %metaroles = ( + base_class_roles => [ 'MooseX::UndefTolerant::Object' ], + class_metaroles => { + attribute => [ 'MooseX::UndefTolerant::Attribute' ], } ); +if ( $Moose::VERSION < 1.9900 ) { + $metaroles{class_metaroles}{constructor} = [ + 'MooseX::UndefTolerant::Constructor', + ]; +} +else { + $metaroles{class_metaroles}{class} = [ + 'MooseX::UndefTolerant::Class', + ]; + $metaroles{role_metaroles} = { + applied_attribute => [ + 'MooseX::UndefTolerant::Attribute', + ], + role => [ + 'MooseX::UndefTolerant::Role', + ], + application_to_class => [ + 'MooseX::UndefTolerant::ApplicationToClass', + ], + application_to_role => [ + 'MooseX::UndefTolerant::ApplicationToRole', + ], + }; +} + + +Moose::Exporter->setup_import_methods(%metaroles); 1; -__END__ - -=head1 NAME +# ABSTRACT: Make your attribute(s) tolerant to undef initialization -MooseX::UndefTolerant - Make your attribute(s) tolerant to undef intitialization +__END__ =head1 SYNOPSIS @@ -60,8 +88,19 @@ Or, if you only want one attribute to have this behaviour: Loading this module in your L class makes initialization of your attributes tolerant of undef. If you specify the value of undef to any of -the attributes they will not be initialized. Effectively behaving as if you -had not provided a value at all. +the attributes they will not be initialized, effectively behaving as if you +had not provided a value at all. Such values are also cleaned from BUILDARGS. + +You can also apply the 'UndefTolerant' trait to individual attributes. See +L for details. + +There will be no change in behaviour to any attribute with a type constraint +that accepts undef values (for example C types), as it is presumed that +since the type is already "undef tolerant", there is no need to avoid +initializing the attribute value with C. + +As of Moose 1.9900, this module can also be used in a role, in which case all +of that role's attributes will be undef-tolerant. =head1 MOTIVATION @@ -86,20 +125,29 @@ Maybe[Str] and I still want my predicate (C) to work. The only real solution was: if(defined($foo)) { - $class = My:CLass->new(foo => $foo, bar => 123); + $class = My:Class->new(foo => $foo, bar => 123); } else { - $class = My:CLass->new(bar => 123); + $class = My:Class->new(bar => 123); } -Or some type of codemulch using ternarys. This module allows you to make -your attributes more tolerant of undef so that you can keep the first +Or some type of codemulch using ternary conditionals. This module allows you +to make your attributes more tolerant of undef so that you can keep the first example: have your cake and eat it too! =head1 PER ATTRIBUTE -=head1 AUTHOR +See L. -Cory G Watson, C<< >> +=head1 CAVEATS + +This extension does not currently work in immutable classes when applying the +trait to a specific attributes in the class, as opposed to the class itself. +This is because the inlined constructor initialization code currently lives in +L, not L. The good news is that +this is expected to be changing shortly. + +Also, BUILDARGS cannot be cleaned up if the entire class is not made undef +tolerant, as attribute traits cannot modify class constructor behaviour. =head1 ACKNOWLEDGEMENTS @@ -117,14 +165,4 @@ Jay Shirley (jshirley) Mike Eldridge (diz) -=head1 COPYRIGHT & LICENSE - -Copyright 2009 Cory G Watson. - -This program is free software; you can redistribute it and/or modify it -under the terms of either: the GNU General Public License as published -by the Free Software Foundation; or the Artistic License. - -See http://dev.perl.org/licenses/ for more information. - =cut