package MooseX::UndefTolerant;
+use strict;
+use warnings;
+
use Moose qw();
use Moose::Exporter;
use MooseX::UndefTolerant::Constructor;
-my %metaroles = ( attribute => [ 'MooseX::UndefTolerant::Attribute' ] );
+my %metaroles = (
+ class_metaroles => {
+ attribute => [ 'MooseX::UndefTolerant::Attribute' ],
+ }
+);
if ( $Moose::VERSION < 1.9900 ) {
- $metaroles{constructor} = [ 'MooseX::UndefTolerant::Constructor' ];
+ $metaroles{class_metaroles}{constructor} = [
+ 'MooseX::UndefTolerant::Constructor',
+ ];
}
else {
- $metaroles{class} = [ 'MooseX::UndefTolerant::Class' ];
+ $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(
- class_metaroles => \%metaroles,
-);
+Moose::Exporter->setup_import_methods(%metaroles);
1;
the attributes they will not be initialized, effectively behaving as if you
had not provided a value at all.
-You can also apply the 'UndefTolerant' trait to individual attributes. See See
+You can also apply the 'UndefTolerant' trait to individual attributes. See
L<MooseX::UndefTolerant::Attribute> for details.
There will be no change in behaviour to any attribute with a type constraint
since the type is already "undef tolerant", there is no need to avoid
initializing the attribute value with C<undef>.
+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
I often found myself in this quandry:
$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
This extension does not currently work in immutable classes when applying the
trait to some (but not all) attributes in the class. This is because the
inlined constructor initialization code currently lives in
-L<Moose::Meta::Method::Constructor>, not L<Moose::Meta::Attribute>. The good
-news is that this is expected to be changing shortly.
+L<Moose::Meta::Class>, not L<Moose::Meta::Attribute>. The good news is that
+this is expected to be changing shortly.
=head1 ACKNOWLEDGEMENTS