bump version to 0.23
[gitmo/MooseX-AttributeHelpers.git] / lib / MooseX / AttributeHelpers.pm
1
2 package MooseX::AttributeHelpers;
3
4 our $VERSION   = '0.23';
5 $VERSION = eval $VERSION;
6 our $AUTHORITY = 'cpan:STEVAN';
7
8 use Moose 0.56 ();
9
10 use MooseX::AttributeHelpers::Meta::Method::Provided;
11 use MooseX::AttributeHelpers::Meta::Method::Curried;
12
13 use MooseX::AttributeHelpers::Trait::Bool;
14 use MooseX::AttributeHelpers::Trait::Counter;
15 use MooseX::AttributeHelpers::Trait::Number;
16 use MooseX::AttributeHelpers::Trait::String;
17 use MooseX::AttributeHelpers::Trait::Collection::List;
18 use MooseX::AttributeHelpers::Trait::Collection::Array;
19 use MooseX::AttributeHelpers::Trait::Collection::Hash;
20 use MooseX::AttributeHelpers::Trait::Collection::ImmutableHash;
21 use MooseX::AttributeHelpers::Trait::Collection::Bag;
22
23 use MooseX::AttributeHelpers::Counter;
24 use MooseX::AttributeHelpers::Number;
25 use MooseX::AttributeHelpers::String;
26 use MooseX::AttributeHelpers::Bool;
27 use MooseX::AttributeHelpers::Collection::List;
28 use MooseX::AttributeHelpers::Collection::Array;
29 use MooseX::AttributeHelpers::Collection::Hash;
30 use MooseX::AttributeHelpers::Collection::ImmutableHash;
31 use MooseX::AttributeHelpers::Collection::Bag;
32
33 1;
34
35 __END__
36
37 =pod
38
39 =head1 NAME
40
41 MooseX::AttributeHelpers - Extend your attribute interfaces
42
43 =head1 SYNOPSIS
44
45   package MyClass;
46   use Moose;
47   use MooseX::AttributeHelpers;
48
49   has 'mapping' => (
50       metaclass => 'Collection::Hash',
51       is        => 'rw',
52       isa       => 'HashRef[Str]',
53       default   => sub { {} },
54       provides  => {
55           exists    => 'exists_in_mapping',
56           keys      => 'ids_in_mapping',
57           get       => 'get_mapping',
58           set       => 'set_mapping',
59       },
60       curries  => {
61           set       => { set_quantity => [ 'quantity' ] }
62       }
63   );
64
65
66   # ...
67
68   my $obj = MyClass->new;
69   $obj->set_quantity(10);      # quantity => 10
70   $obj->set_mapping(4, 'foo'); # 4 => 'foo'
71   $obj->set_mapping(5, 'bar'); # 5 => 'bar'
72   $obj->set_mapping(6, 'baz'); # 6 => 'baz'
73
74
75   # prints 'bar'
76   print $obj->get_mapping(5) if $obj->exists_in_mapping(5);
77
78   # prints '4, 5, 6'
79   print join ', ', $obj->ids_in_mapping;
80
81 =head1 DESCRIPTION
82
83 While L<Moose> attributes provide you with a way to name your accessors,
84 readers, writers, clearers and predicates, this library provides commonly
85 used attribute helper methods for more specific types of data.
86
87 As seen in the L</SYNOPSIS>, you specify the extension via the 
88 C<metaclass> parameter. Available meta classes are:
89
90 =head1 PARAMETERS
91
92 =head2 provides
93
94 This points to a hashref that uses C<provider> for the keys and
95 C<method> for the values.  The method will be added to
96 the object itself and do what you want.
97
98 =head2 curries
99
100 This points to a hashref that uses C<provider> for the keys and
101 has two choices for the value:
102
103 You can supply C<< {method => [ @args ]} >> for the values.  The method will be
104 added to the object itself (always using C<@args> as the beginning arguments).
105
106 Another approach to curry a method provider is to supply a coderef instead of an
107 arrayref. The code ref takes C<$self>, C<$body>, and any additional arguments
108 passed to the final method.
109
110   # ...
111
112   curries => {
113       grep => {
114           times_with_day => sub {
115               my ($self, $body, $datetime) = @_;
116               $body->($self, sub { $_->ymd eq $datetime->ymd });
117           }
118       }
119   }
120
121   # ...
122
123   $obj->times_with_day(DateTime->now); # takes datetime argument, checks day
124
125
126 =head1 METHOD PROVIDERS
127
128 =over
129
130 =item L<Number|MooseX::AttributeHelpers::Number>
131
132 Common numerical operations.
133
134 =item L<String|MooseX::AttributeHelpers::String>
135
136 Common methods for string operations.
137
138 =item L<Counter|MooseX::AttributeHelpers::Counter>
139
140 Methods for incrementing and decrementing a counter attribute.
141
142 =item L<Bool|MooseX::AttributeHelpers::Bool>
143
144 Common methods for boolean values.
145
146 =item L<Collection::Hash|MooseX::AttributeHelpers::Collection::Hash>
147
148 Common methods for hash references.
149
150 =item L<Collection::ImmutableHash|MooseX::AttributeHelpers::Collection::ImmutableHash>
151
152 Common methods for inspecting hash references.
153
154 =item L<Collection::Array|MooseX::AttributeHelpers::Collection::Array>
155
156 Common methods for array references.
157
158 =item L<Collection::List|MooseX::AttributeHelpers::Collection::List>
159
160 Common list methods for array references. 
161
162 =back
163
164 =head1 CAVEAT
165
166 This is an early release of this module. Right now it is in great need 
167 of documentation and tests in the test suite. However, we have used this 
168 module to great success at C<$work> where it has been tested very thoroughly
169 and deployed into a major production site.
170
171 I plan on getting better docs and tests in the next few releases, but until 
172 then please refer to the few tests we do have and feel free email and/or 
173 message me on irc.perl.org if you have any questions.
174
175 =head1 TODO
176
177 We need tests and docs badly.
178
179 =head1 BUGS
180
181 All complex software has bugs lurking in it, and this module is no 
182 exception. If you find a bug please either email me, or add the bug
183 to cpan-RT.
184
185 =head1 AUTHOR
186
187 Stevan Little E<lt>stevan@iinteractive.comE<gt>
188
189 B<with contributions from:>
190
191 Robert (rlb3) Boone
192
193 Paul (frodwith) Driver
194
195 Shawn (Sartak) Moore
196
197 Chris (perigrin) Prather
198
199 Robert (phaylon) Sedlacek
200
201 Tom (dec) Lanyon
202
203 Yuval Kogman
204
205 Jason May
206
207 Cory (gphat) Watson
208
209 Florian (rafl) Ragwitz
210
211 Evan Carroll
212
213 Jesse (doy) Luehrs
214
215 =head1 COPYRIGHT AND LICENSE
216
217 Copyright 2007-2009 by Infinity Interactive, Inc.
218
219 L<http://www.iinteractive.com>
220
221 This library is free software; you can redistribute it and/or modify
222 it under the same terms as Perl itself.
223
224 =cut