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