better test descriptions
[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
fff0a09d 11my %metaroles = (
12 class_metaroles => {
13 attribute => [ 'MooseX::UndefTolerant::Attribute' ],
14 }
15);
d6ce838b 16if ( $Moose::VERSION < 1.9900 ) {
fff0a09d 17 $metaroles{class_metaroles}{constructor} = [
18 'MooseX::UndefTolerant::Constructor',
19 ];
d6ce838b 20}
21else {
fff0a09d 22 $metaroles{class_metaroles}{class} = [
23 'MooseX::UndefTolerant::Class',
24 ];
25 $metaroles{role_metaroles} = {
26 applied_attribute => [
27 'MooseX::UndefTolerant::Attribute',
28 ],
29 role => [
30 'MooseX::UndefTolerant::Role',
31 ],
32 application_to_class => [
33 'MooseX::UndefTolerant::ApplicationToClass',
34 ],
35 application_to_role => [
36 'MooseX::UndefTolerant::ApplicationToRole',
37 ],
38 };
d6ce838b 39}
40
41
fff0a09d 42Moose::Exporter->setup_import_methods(%metaroles);
5447ee45 43
441;
45
b2c5b43c 46# ABSTRACT: Make your attribute(s) tolerant to undef initialization
5447ee45 47
b2c5b43c 48__END__
5447ee45 49
50=head1 SYNOPSIS
51
19258058 52 package My::Class;
5447ee45 53
19258058 54 use Moose;
55 use MooseX::UndefTolerant;
56
57 has 'name' => (
58 is => 'ro',
59 isa => 'Str',
60 predicate => 'has_name'
61 );
62
63 # Meanwhile, under the city...
64
65 # Doesn't explode
66 my $class = My::Class->new(name => undef);
67 $class->has_name # False!
68
69Or, if you only want one attribute to have this behaviour:
70
71 package My:Class;
72 use Moose;
73
74 use MooseX::UndefTolerant::Attribute;
75
76 has 'bar' => (
77 traits => [ qw(MooseX::UndefTolerant::Attribute)],
78 is => 'ro',
79 isa => 'Num',
80 predicate => 'has_bar'
81 );
82
83=head1 DESCRIPTION
84
85Loading this module in your L<Moose> class makes initialization of your
86attributes tolerant of undef. If you specify the value of undef to any of
94f9d198 87the attributes they will not be initialized, effectively behaving as if you
19258058 88had not provided a value at all.
89
1686337d 90You can also apply the 'UndefTolerant' trait to individual attributes. See
793ea91a 91L<MooseX::UndefTolerant::Attribute> for details.
92
93There will be no change in behaviour to any attribute with a type constraint
94that accepts undef values (for example C<Maybe> types), as it is presumed that
95since the type is already "undef tolerant", there is no need to avoid
96initializing the attribute value with C<undef>.
97
2b46c488 98As of Moose 1.9900, this module can also be used in a role, in which case all
99of that role's attributes will be undef-tolerant.
100
19258058 101=head1 MOTIVATION
102
103I often found myself in this quandry:
104
105 package My:Class;
106 use Moose;
107
108 has 'foo' => (
109 is => 'ro',
110 isa => 'Str',
111 );
112
113 # ... then
114
115 my $foo = ... # get the param from something
116
117 my $class = My:Class->new(foo => $foo, bar => 123);
118
119What if foo is undefined? I didn't want to change my attribute to be
120Maybe[Str] and I still want my predicate (C<has_foo>) to work. The only
121real solution was:
122
123 if(defined($foo)) {
1cbb963b 124 $class = My:Class->new(foo => $foo, bar => 123);
19258058 125 } else {
1cbb963b 126 $class = My:Class->new(bar => 123);
19258058 127 }
128
c5dd383b 129Or some type of codemulch using ternary conditionals. This module allows you
130to make your attributes more tolerant of undef so that you can keep the first
19258058 131example: have your cake and eat it too!
132
133=head1 PER ATTRIBUTE
5447ee45 134
1cbb963b 135See L<MooseX::UndefTolerant::Attribute>.
136
94f9d198 137=head1 CAVEATS
138
139This extension does not currently work in immutable classes when applying the
140trait to some (but not all) attributes in the class. This is because the
141inlined constructor initialization code currently lives in
142L<Moose::Meta::Method::Constructor>, not L<Moose::Meta::Attribute>. The good
143news is that this is expected to be changing shortly.
144
5447ee45 145=head1 ACKNOWLEDGEMENTS
146
19258058 147Many thanks to the crew in #moose who talked me through this module:
148
5447ee45 149Hans Dieter Pearcey (confound)
150
151Jesse Luehrs (doy)
152
153Tomas Doran (t0m)
154
155Dylan Hardison (dylan)
156
157Jay Shirley (jshirley)
158
159Mike Eldridge (diz)
160
5447ee45 161=cut