bump version numbers
[gitmo/Moose.git] / lib / Moose / Meta / Attribute / Native.pm
CommitLineData
17e5e226 1package Moose::Meta::Attribute::Native;
e3c07b19 2
122a129a 3our $VERSION = '0.89';
e3c07b19 4$VERSION = eval $VERSION;
5our $AUTHORITY = 'cpan:STEVAN';
6
fafc8b9b 7my @trait_names = qw(Bool Counter Number String Array Hash);
8
9for my $trait_name (@trait_names) {
c466e58f 10 my $trait_class = "Moose::Meta::Attribute::Native::Trait::$trait_name";
fafc8b9b 11 my $meta = Class::MOP::Class->initialize(
12 "Moose::Meta::Attribute::Custom::Trait::$trait_name"
13 );
14 if ($meta->find_method_by_name('register_implementation')) {
15 my $class = $meta->name->register_implementation;
16 Moose->throw_error(
17 "An implementation for $trait_name already exists " .
18 "(found '$class' when trying to register '$trait_class')"
19 );
20 }
21 $meta->add_method(register_implementation => sub {
22 # resolve_metatrait_alias will load classes anyway, but throws away
23 # their error message; we WANT to die if there's a problem
24 Class::MOP::load_class($trait_class);
25 return $trait_class;
26 });
27}
e3c07b19 28
e3c07b19 291;
30
31__END__
32
33=pod
34
35=head1 NAME
36
17e5e226 37Moose::Meta::Attribute::Native - Extend your attribute interfaces
e3c07b19 38
39=head1 SYNOPSIS
40
41 package MyClass;
42 use Moose;
e3c07b19 43
44 has 'mapping' => (
a40b446a 45 traits => [ 'Hash' ],
e3c07b19 46 is => 'rw',
47 isa => 'HashRef[Str]',
48 default => sub { {} },
49 handles => {
50 exists_in_mapping => 'exists',
51 ids_in_mapping => 'keys',
52 get_mapping => 'get',
53 set_mapping => 'set',
54 set_quantity => [ set => [ 'quantity' ] ],
55 },
56 );
57
58
59 # ...
60
61 my $obj = MyClass->new;
62 $obj->set_quantity(10); # quantity => 10
63 $obj->set_mapping(4, 'foo'); # 4 => 'foo'
64 $obj->set_mapping(5, 'bar'); # 5 => 'bar'
65 $obj->set_mapping(6, 'baz'); # 6 => 'baz'
66
67
68 # prints 'bar'
69 print $obj->get_mapping(5) if $obj->exists_in_mapping(5);
70
71 # prints '4, 5, 6'
72 print join ', ', $obj->ids_in_mapping;
73
74=head1 DESCRIPTION
75
76While L<Moose> attributes provide you with a way to name your accessors,
77readers, writers, clearers and predicates, this library provides commonly
78used attribute helper methods for more specific types of data.
79
80As seen in the L</SYNOPSIS>, you specify the extension via the
5f3663b2 81C<trait> parameter. Available meta classes are below; see L</METHOD PROVIDERS>.
e3c07b19 82
87b4e821 83This module used to exist as the L<MooseX::AttributeHelpers> extension. It was
84very commonly used, so we moved it into core Moose. Since this gave us a chance
85to change the interface, you will have to change your code or continue using
86the L<MooseX::AttributeHelpers> extension.
87
e3c07b19 88=head1 PARAMETERS
89
90=head2 handles
91
5f3663b2 92This is like C<< handles >> in L<Moose/has>, but only HASH references are
93allowed. Keys are method names that you want installed locally, and values are
87b4e821 94methods from the method providers (below). Currying with delegated methods
95works normally for C<< handles >>.
e3c07b19 96
97=head1 METHOD PROVIDERS
98
99=over
100
c466e58f 101=item L<Number|Moose::Meta::Attribute::Native::Trait::Number>
e3c07b19 102
103Common numerical operations.
104
52e0d71f 105 has 'integer' => (
106 metaclass => 'Number',
107 is => 'ro',
108 isa => 'Int',
109 default => 5,
110 handles => {
111 set => 'set',
112 add => 'add',
113 sub => 'sub',
114 mul => 'mul',
115 div => 'div',
116 mod => 'mod',
117 abs => 'abs',
118 }
119 );
120
c466e58f 121=item L<String|Moose::Meta::Attribute::Native::Trait::String>
e3c07b19 122
123Common methods for string operations.
124
52e0d71f 125 has 'text' => (
126 metaclass => 'String',
127 is => 'rw',
128 isa => 'Str',
129 default => q{},
130 handles => {
131 add_text => 'append',
132 replace_text => 'replace',
133 }
134 );
135
c466e58f 136=item L<Counter|Moose::Meta::Attribute::Native::Trait::Counter>
e3c07b19 137
138Methods for incrementing and decrementing a counter attribute.
139
52e0d71f 140 has 'counter' => (
141 traits => ['Counter'],
142 is => 'ro',
143 isa => 'Num',
144 default => 0,
145 handles => {
146 inc_counter => 'inc',
147 dec_counter => 'dec',
148 reset_counter => 'reset',
149 }
150 );
151
c466e58f 152=item L<Bool|Moose::Meta::Attribute::Native::Trait::Bool>
e3c07b19 153
154Common methods for boolean values.
155
52e0d71f 156 has 'is_lit' => (
157 traits => ['Bool'],
158 is => 'rw',
159 isa => 'Bool',
160 default => 0,
161 handles => {
162 illuminate => 'set',
163 darken => 'unset',
164 flip_switch => 'toggle',
165 is_dark => 'not',
166 }
167 );
168
169
c466e58f 170=item L<Hash|Moose::Meta::Attribute::Native::Trait::Hash>
e3c07b19 171
172Common methods for hash references.
173
52e0d71f 174 has 'options' => (
175 traits => ['Hash'],
176 is => 'ro',
177 isa => 'HashRef[Str]',
178 default => sub { {} },
179 handles => {
180 set_option => 'set',
181 get_option => 'get',
182 has_option => 'exists',
183 }
184 );
e3c07b19 185
c466e58f 186=item L<Array|Moose::Meta::Attribute::Native::Trait::Array>
e3c07b19 187
188Common methods for array references.
189
52e0d71f 190 has 'queue' => (
191 traits => ['Array'],
192 is => 'ro',
193 isa => 'ArrayRef[Str]',
194 default => sub { [] },
195 handles => {
196 add_item => 'push'
197 next_item => 'shift',
198 }
199 );
e3c07b19 200
201=back
202
e3c07b19 203=head1 BUGS
204
205All complex software has bugs lurking in it, and this module is no
206exception. If you find a bug please either email me, or add the bug
207to cpan-RT.
208
209=head1 AUTHOR
210
211Stevan Little E<lt>stevan@iinteractive.comE<gt>
212
213B<with contributions from:>
214
215Robert (rlb3) Boone
216
217Paul (frodwith) Driver
218
219Shawn (Sartak) Moore
220
221Chris (perigrin) Prather
222
223Robert (phaylon) Sedlacek
224
225Tom (dec) Lanyon
226
227Yuval Kogman
228
229Jason May
230
231Cory (gphat) Watson
232
233Florian (rafl) Ragwitz
234
235Evan Carroll
236
237Jesse (doy) Luehrs
238
239=head1 COPYRIGHT AND LICENSE
240
241Copyright 2007-2009 by Infinity Interactive, Inc.
242
243L<http://www.iinteractive.com>
244
245This library is free software; you can redistribute it and/or modify
246it under the same terms as Perl itself.
247
248=cut