update repository info now that we are on shadowcat
[gitmo/MooseX-UndefTolerant.git] / lib / MooseX / UndefTolerant.pm
CommitLineData
5447ee45 1package MooseX::UndefTolerant;
5447ee45 2
3use Moose qw();
4use Moose::Exporter;
5447ee45 5
6use MooseX::UndefTolerant::Attribute;
d6ce838b 7use MooseX::UndefTolerant::Class;
2d1c57bd 8use MooseX::UndefTolerant::Constructor;
5447ee45 9
5447ee45 10
d6ce838b 11my %metaroles = ( attribute => [ 'MooseX::UndefTolerant::Attribute' ] );
12if ( $Moose::VERSION < 1.9900 ) {
13 $metaroles{constructor} = [ 'MooseX::UndefTolerant::Constructor' ];
14}
15else {
16 $metaroles{class} = [ 'MooseX::UndefTolerant::Class' ];
17}
18
19
e92df8d4 20Moose::Exporter->setup_import_methods(
d6ce838b 21 class_metaroles => \%metaroles,
e92df8d4 22);
5447ee45 23
241;
25
b2c5b43c 26# ABSTRACT: Make your attribute(s) tolerant to undef initialization
5447ee45 27
b2c5b43c 28__END__
5447ee45 29
30=head1 SYNOPSIS
31
19258058 32 package My::Class;
5447ee45 33
19258058 34 use Moose;
35 use MooseX::UndefTolerant;
36
37 has 'name' => (
38 is => 'ro',
39 isa => 'Str',
40 predicate => 'has_name'
41 );
42
43 # Meanwhile, under the city...
44
45 # Doesn't explode
46 my $class = My::Class->new(name => undef);
47 $class->has_name # False!
48
49Or, if you only want one attribute to have this behaviour:
50
51 package My:Class;
52 use Moose;
53
54 use MooseX::UndefTolerant::Attribute;
55
56 has 'bar' => (
57 traits => [ qw(MooseX::UndefTolerant::Attribute)],
58 is => 'ro',
59 isa => 'Num',
60 predicate => 'has_bar'
61 );
62
63=head1 DESCRIPTION
64
65Loading this module in your L<Moose> class makes initialization of your
66attributes tolerant of undef. If you specify the value of undef to any of
94f9d198 67the attributes they will not be initialized, effectively behaving as if you
19258058 68had not provided a value at all.
69
70=head1 MOTIVATION
71
72I often found myself in this quandry:
73
74 package My:Class;
75 use Moose;
76
77 has 'foo' => (
78 is => 'ro',
79 isa => 'Str',
80 );
81
82 # ... then
83
84 my $foo = ... # get the param from something
85
86 my $class = My:Class->new(foo => $foo, bar => 123);
87
88What if foo is undefined? I didn't want to change my attribute to be
89Maybe[Str] and I still want my predicate (C<has_foo>) to work. The only
90real solution was:
91
92 if(defined($foo)) {
1cbb963b 93 $class = My:Class->new(foo => $foo, bar => 123);
19258058 94 } else {
1cbb963b 95 $class = My:Class->new(bar => 123);
19258058 96 }
97
98Or some type of codemulch using ternarys. This module allows you to make
99your attributes more tolerant of undef so that you can keep the first
100example: have your cake and eat it too!
101
102=head1 PER ATTRIBUTE
5447ee45 103
1cbb963b 104See L<MooseX::UndefTolerant::Attribute>.
105
94f9d198 106=head1 CAVEATS
107
108This extension does not currently work in immutable classes when applying the
109trait to some (but not all) attributes in the class. This is because the
110inlined constructor initialization code currently lives in
111L<Moose::Meta::Method::Constructor>, not L<Moose::Meta::Attribute>. The good
112news is that this is expected to be changing shortly.
113
5447ee45 114=head1 ACKNOWLEDGEMENTS
115
19258058 116Many thanks to the crew in #moose who talked me through this module:
117
5447ee45 118Hans Dieter Pearcey (confound)
119
120Jesse Luehrs (doy)
121
122Tomas Doran (t0m)
123
124Dylan Hardison (dylan)
125
126Jay Shirley (jshirley)
127
128Mike Eldridge (diz)
129
5447ee45 130=cut