use Moose::Exporter;
use MooseX::UndefTolerant::Attribute;
+use MooseX::UndefTolerant::Class;
use MooseX::UndefTolerant::Constructor;
-our $VERSION = '0.04';
+our $VERSION = '0.09';
+
+my %metaroles = ( attribute => [ 'MooseX::UndefTolerant::Attribute' ] );
+if ( $Moose::VERSION < 1.9900 ) {
+ $metaroles{constructor} = [ 'MooseX::UndefTolerant::Constructor' ];
+}
+else {
+ $metaroles{class} = [ 'MooseX::UndefTolerant::Class' ];
+}
+
Moose::Exporter->setup_import_methods(
- class_metaroles => {
- attribute => [ 'MooseX::UndefTolerant::Attribute' ],
- constructor => [ 'MooseX::UndefTolerant::Constructor' ],
- }
+ class_metaroles => \%metaroles,
);
1;
Loading this module in your L<Moose> 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
+the attributes they will not be initialized, effectively behaving as if you
had not provided a value at all.
=head1 MOTIVATION
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
example: have your cake and eat it too!
-=head1 USE IN YOUR MOOSE EXPORTER
+=head1 PER ATTRIBUTE
-If you already have a custom Moose exporter class and you want this
-behaviour everywhere, you can add these roles there with this call, in
-your C<init_meta> routine:
+See L<MooseX::UndefTolerant::Attribute>.
- Moose::Util::MetaRole::apply_metaroles(
- class_metaroles => {
- attribute => [ 'MooseX::UndefTolerant::Attribute' ],
- constructor => [ 'MooseX::UndefTolerant::Constructor' ],
- },
- for => $args{for_class},
- );
+=head1 CAVEATS
-=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.
=head1 AUTHOR