2 package MooseX::AttributeHelpers;
5 $VERSION = eval $VERSION;
6 our $AUTHORITY = 'cpan:STEVAN';
10 use MooseX::AttributeHelpers::Meta::Method::Provided;
11 use MooseX::AttributeHelpers::Meta::Method::Curried;
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;
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;
41 MooseX::AttributeHelpers - Extend your attribute interfaces
47 use MooseX::AttributeHelpers;
50 metaclass => 'Collection::Hash',
52 isa => 'HashRef[Str]',
53 default => sub { {} },
55 exists => 'exists_in_mapping',
56 keys => 'ids_in_mapping',
61 set => { set_quantity => [ 'quantity' ] }
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'
76 print $obj->get_mapping(5) if $obj->exists_in_mapping(5);
79 print join ', ', $obj->ids_in_mapping;
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.
87 As seen in the L</SYNOPSIS>, you specify the extension via the
88 C<metaclass> parameter. Available meta classes are:
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.
100 This points to a hashref that uses C<provider> for the keys and
101 has two choices for the value:
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).
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.
114 times_with_day => sub {
115 my ($self, $body, $datetime) = @_;
116 $body->($self, sub { $_->ymd eq $datetime->ymd });
123 $obj->times_with_day(DateTime->now); # takes datetime argument, checks day
126 =head1 METHOD PROVIDERS
130 =item L<Number|MooseX::AttributeHelpers::Number>
132 Common numerical operations.
134 =item L<Counter|MooseX::AttributeHelpers::Counter>
136 Methods for incrementing and decrementing a counter attribute.
138 =item L<Bool|MooseX::AttributeHelpers::Bool>
140 Common methods for boolean values.
142 =item L<Collection::Hash|MooseX::AttributeHelpers::Collection::Hash>
144 Common methods for hash references.
146 =item L<Collection::Array|MooseX::AttributeHelpers::Collection::Array>
148 Common methods for array references.
150 =item L<Collection::List|MooseX::AttributeHelpers::Collection::List>
152 Common list methods for array references.
158 This is an early release of this module. Right now it is in great need
159 of documentation and tests in the test suite. However, we have used this
160 module to great success at C<$work> where it has been tested very thoroughly
161 and deployed into a major production site.
163 I plan on getting better docs and tests in the next few releases, but until
164 then please refer to the few tests we do have and feel free email and/or
165 message me on irc.perl.org if you have any questions.
169 We need tests and docs badly.
173 All complex software has bugs lurking in it, and this module is no
174 exception. If you find a bug please either email me, or add the bug
179 Stevan Little E<lt>stevan@iinteractive.comE<gt>
181 B<with contributions from:>
185 Paul (frodwith) Driver
189 Chris (perigrin) Prather
191 Robert (phaylon) Sedlacek
201 Florian (rafl) Ragwitz
207 =head1 COPYRIGHT AND LICENSE
209 Copyright 2007-2009 by Infinity Interactive, Inc.
211 L<http://www.iinteractive.com>
213 This library is free software; you can redistribute it and/or modify
214 it under the same terms as Perl itself.