Lots of doc improvements for native delegations.
[gitmo/Moose.git] / lib / Moose / Meta / Attribute / Native / Trait / Array.pm
1
2 package Moose::Meta::Attribute::Native::Trait::Array;
3 use Moose::Role;
4
5 our $VERSION   = '1.15';
6 $VERSION = eval $VERSION;
7 our $AUTHORITY = 'cpan:STEVAN';
8
9 use Moose::Meta::Method::Accessor::Native::Array::accessor;
10 use Moose::Meta::Method::Accessor::Native::Array::clear;
11 use Moose::Meta::Method::Accessor::Native::Array::count;
12 use Moose::Meta::Method::Accessor::Native::Array::delete;
13 use Moose::Meta::Method::Accessor::Native::Array::elements;
14 use Moose::Meta::Method::Accessor::Native::Array::first;
15 use Moose::Meta::Method::Accessor::Native::Array::get;
16 use Moose::Meta::Method::Accessor::Native::Array::grep;
17 use Moose::Meta::Method::Accessor::Native::Array::insert;
18 use Moose::Meta::Method::Accessor::Native::Array::is_empty;
19 use Moose::Meta::Method::Accessor::Native::Array::join;
20 use Moose::Meta::Method::Accessor::Native::Array::map;
21 use Moose::Meta::Method::Accessor::Native::Array::natatime;
22 use Moose::Meta::Method::Accessor::Native::Array::pop;
23 use Moose::Meta::Method::Accessor::Native::Array::push;
24 use Moose::Meta::Method::Accessor::Native::Array::reduce;
25 use Moose::Meta::Method::Accessor::Native::Array::set;
26 use Moose::Meta::Method::Accessor::Native::Array::shift;
27 use Moose::Meta::Method::Accessor::Native::Array::shuffle;
28 use Moose::Meta::Method::Accessor::Native::Array::splice;
29 use Moose::Meta::Method::Accessor::Native::Array::sort;
30 use Moose::Meta::Method::Accessor::Native::Array::sort_in_place;
31 use Moose::Meta::Method::Accessor::Native::Array::uniq;
32 use Moose::Meta::Method::Accessor::Native::Array::unshift;
33
34 with 'Moose::Meta::Attribute::Native::Trait';
35
36 sub _helper_type { 'ArrayRef' }
37
38 no Moose::Role;
39
40 1;
41
42 __END__
43
44 =pod
45
46 =head1 NAME
47
48 Moose::Meta::Attribute::Native::Trait::Array - Helper trait for array delegation
49
50 =head1 SYNOPSIS
51
52     package Stuff;
53     use Moose;
54
55     has 'options' => (
56         traits  => ['Array'],
57         is      => 'ro',
58         isa     => 'ArrayRef[Str]',
59         default => sub { [] },
60         handles => {
61             all_options    => 'elements',
62             add_option     => 'push',
63             map_options    => 'map',
64             filter_options => 'grep',
65             find_option    => 'first',
66             get_option     => 'get',
67             join_options   => 'join',
68             count_options  => 'count',
69             has_options    => 'count',
70             has_no_options => 'is_empty',
71             sorted_options => 'sort',
72         },
73     );
74
75     no Moose;
76     1;
77
78 =head1 DESCRIPTION
79
80 This module provides an Array attribute which provides a number of
81 array operations.
82
83 =head1 PROVIDED METHODS
84
85 =over 4
86
87 =item * B<count>
88
89 Returns the number of elements in the array.
90
91   $stuff = Stuff->new;
92   $stuff->options( [ "foo", "bar", "baz", "boo" ] );
93
94   print $stuff->count_options; # prints 4
95
96 This method does not accept any arguments.
97
98 =item * B<is_empty>
99
100 Returns a boolean value that is true when the array has no elements.
101
102   $stuff->has_no_options ? die "No options!\n" : print "Good boy.\n";
103
104 This method does not accept any arguments.
105
106 =item * B<elements>
107
108 Returns all of the elements of the array as an array (not an array reference).
109
110   my @option = $stuff->all_options;
111   print "@options\n";    # prints "foo bar baz boo"
112
113 This method does not accept any arguments.
114
115 =item * B<get($index)>
116
117 Returns an element of the array by its index. You can also use negative index
118 numbers, just as with Perl's core array handling.
119
120   my $option = $stuff->get_option(1);
121   print "$option\n";    # prints "bar"
122
123 If the specified element does not exist, this will return C<undef>.
124
125 This method does accepts just one argument.
126
127 =item * B<pop>
128
129 Just like Perl's builtin C<pop>.
130
131 This method does not accept any arguments.
132
133 =item * B<push($value1, $value2, value3 ...)>
134
135 Just like Perl's builtin C<push>. Returns the number of elements in the new
136 array.
137
138 This method accepts any number of arguments.
139
140 =item * B<shift>
141
142 Just like Perl's builtin C<shift>.
143
144 This method does not accept any arguments.
145
146 =item * B<unshift($value1, $value2, value3 ...)>
147
148 Just like Perl's builtin C<unshift>. Returns the number of elements in the new
149 array.
150
151 This method accepts any number of arguments.
152
153 =item * B<splice($offset, $length, @values)>
154
155 Just like Perl's builtin C<splice>. In scalar context, this returns the last
156 element removed, or C<undef> if no elements were removed. In list context,
157 this returns all the elements removed from the array.
158
159 This method requires at least one argument.
160
161 =item * B<first( sub { ... } )>
162
163 This method returns the first item matching item in the array, just like
164 L<List::Util>'s C<first> function. The matching is done with a subroutine
165 reference you pass to this method. The subroutine will be called against each
166 element in the array until one matches or all elements have been checked.
167
168   my $found = $stuff->find_option( sub {/^b/} );
169   print "$found\n";    # prints "bar"
170
171 This method requires a single argument.
172
173 =item * B<grep( sub { ... } )>
174
175 This method returns every element matching a given criteria, just like Perl's
176 core C<grep> function. This method requires a subroutine which implements the
177 matching logic.
178
179   my @found = $stuff->filter_options( sub {/^b/} );
180   print "@found\n";    # prints "bar baz boo"
181
182 This method requires a single argument.
183
184 =item * B<map( sub { ... } )>
185
186 This method transforms every element in the array and returns a new array,
187 just like Perl's core C<map> function. This method requires a subroutine which
188 implements the transformation.
189
190   my @mod_options = $stuff->map_options( sub { $_ . "-tag" } );
191   print "@mod_options\n";    # prints "foo-tag bar-tag baz-tag boo-tag"
192
193 This method requires a single argument.
194
195 =item * B<reduce( sub { ... } )>
196
197 This method turns an array into a single value, by passing a function the
198 value so far and the next value in the array, just like L<List::Util>'s
199 C<reduce> function. The reducing is done with a subroutine reference you pass
200 to this method.
201
202   my $found = $stuff->reduce_options( sub { $_[0] . $_[1] } );
203   print "$found\n";    # prints "foobarbazboo"
204
205 This method requires a single argument.
206
207 =item * B<sort>
208
209 =item * B<sort( sub { ... } )>
210
211 Returns the elements of the array in sorted order.
212
213 You can provide an optional subroutine reference to sort with (as you can with
214 Perl's core C<sort> function). However, instead of using C<$a> and C<$b> in
215 this subroutine, you will need to use C<$_[0]> and C<$_[1]>.
216
217   # ascending ASCIIbetical
218   my @sorted = $stuff->sort_options();
219
220   # Descending alphabetical order
221   my @sorted_options = $stuff->sort_options( sub { lc $_[1] cmp lc $_[0] } );
222   print "@sorted_options\n";    # prints "foo boo baz bar"
223
224 This method accepts a single argument.
225
226 =item * B<sort_in_place>
227
228 =item * B<sort_in_place( sub { ... } )>
229
230 Sorts the array I<in place>, modifying the value of the attribute.
231
232 You can provide an optional subroutine reference to sort with (as you can with
233 Perl's core C<sort> function). However, instead of using C<$a> and C<$b>, you
234 will need to use C<$_[0]> and C<$_[1]> instead.
235
236 This method does not define a return value.
237
238 This method accepts a single argument.
239
240 =item * B<shuffle>
241
242 Returns the elements of the array in random order, like C<shuffle> from
243 L<List::Util>.
244
245 This method does not accept any arguments.
246
247 =item * B<uniq>
248
249 Returns the array with all duplicate elements removed, like C<uniq> from
250 L<List::MoreUtils>.
251
252 This method does not accept any arguments.
253
254 =item * B<join($str)>
255
256 Joins every element of the array using the separator given as argument, just
257 like Perl's core C<join> function.
258
259   my $joined = $stuff->join_options(':');
260   print "$joined\n";    # prints "foo:bar:baz:boo"
261
262 This method requires a single argument.
263
264 =item * B<set($index, $value)>
265
266 Given an index and a value, sets the specified array element's value.
267
268 This method returns the value at C<$index> after the set.
269
270 This method requires two arguments.
271
272 =item * B<delete($index)>
273
274 Removes the element at the given index from the array.
275
276 This method returns the deleted value. Note that if no value exists, it will
277 return C<undef>.
278
279 This method requires one argument.
280
281 =item * B<insert($index, $value)>
282
283 Inserts a new element into the array at the given index.
284
285 This method returns the new value at C<$index>.
286
287 This method requires two arguments.
288
289 =item * B<clear>
290
291 Empties the entire array, like C<@array = ()>.
292
293 This method does not define a return value.
294
295 This method does not accept any arguments.
296
297 =item * B<accessor($index)>
298
299 =item * B<accessor($index, $value)>
300
301 This method provides a get/set accessor for the array, based on array indexes.
302 If passed one argument, it returns the value at the specified index.  If
303 passed two arguments, it sets the value of the specified index.
304
305 When called as a setter, this method returns the new value at C<$index>.
306
307 This method accepts one or two arguments.
308
309 =item * B<natatime($n)>
310
311 =item * B<natatime($n, $code)>
312
313 This method returns an iterator which, on each call, returns C<$n> more items
314 from the array, in order, like C<natatime> from L<List::MoreUtils>. A coderef
315 can optionally be provided; it will be called on each group of C<$n> elements
316 in the array.
317
318 This method accepts one or two arguments.
319
320 =back
321
322 =head1 BUGS
323
324 See L<Moose/BUGS> for details on reporting bugs.
325
326 =head1 AUTHOR
327
328 Stevan Little E<lt>stevan@iinteractive.comE<gt>
329
330 =head1 COPYRIGHT AND LICENSE
331
332 Copyright 2007-2009 by Infinity Interactive, Inc.
333
334 L<http://www.iinteractive.com>
335
336 This library is free software; you can redistribute it and/or modify
337 it under the same terms as Perl itself.
338
339 =cut