1 package Moose::Meta::Attribute::Native::MethodProvider::Array;
5 $VERSION = eval $VERSION;
6 our $AUTHORITY = 'cpan:STEVAN';
9 my ( $attr, $reader, $writer ) = @_;
11 scalar @{ $reader->( $_[0] ) };
16 my ( $attr, $reader, $writer ) = @_;
18 scalar @{ $reader->( $_[0] ) } ? 1 : 0;
23 my ( $attr, $reader, $writer ) = @_;
25 my ( $instance, $predicate ) = @_;
26 foreach my $val ( @{ $reader->($instance) } ) {
27 return $val if $predicate->($val);
34 my ( $attr, $reader, $writer ) = @_;
36 my ( $instance, $f ) = @_;
37 CORE::map { $f->($_) } @{ $reader->($instance) };
42 my ( $attr, $reader, $writer ) = @_;
44 my ( $instance, $predicate ) = @_;
45 die "Argument must be a code reference"
46 if $predicate && ref $predicate ne 'CODE';
49 CORE::sort { $predicate->( $a, $b ) } @{ $reader->($instance) };
52 CORE::sort @{ $reader->($instance) };
58 my ( $attr, $reader, $writer ) = @_;
60 my ( $instance, $predicate ) = @_;
61 CORE::grep { $predicate->($_) } @{ $reader->($instance) };
65 sub elements : method {
66 my ( $attr, $reader, $writer ) = @_;
69 @{ $reader->($instance) };
74 my ( $attr, $reader, $writer ) = @_;
76 my ( $instance, $separator ) = @_;
77 join $separator, @{ $reader->($instance) };
82 my ( $attr, $reader, $writer ) = @_;
84 $reader->( $_[0] )->[0];
89 my ( $attr, $reader, $writer ) = @_;
91 $reader->( $_[0] )->[-1];
96 my ( $attr, $reader, $writer ) = @_;
99 $attr->has_type_constraint
100 && $attr->type_constraint->isa(
101 'Moose::Meta::TypeConstraint::Parameterized')
104 my $container_type_constraint = $attr->type_constraint->type_parameter;
106 my $instance = CORE::shift;
107 $container_type_constraint->check($_)
110 . " did not pass container type constraint '$container_type_constraint'"
112 CORE::push @{ $reader->($instance) } => @_;
117 my $instance = CORE::shift;
118 CORE::push @{ $reader->($instance) } => @_;
124 my ( $attr, $reader, $writer ) = @_;
126 CORE::pop @{ $reader->( $_[0] ) };
130 sub unshift : method {
131 my ( $attr, $reader, $writer ) = @_;
133 $attr->has_type_constraint
134 && $attr->type_constraint->isa(
135 'Moose::Meta::TypeConstraint::Parameterized')
138 my $container_type_constraint = $attr->type_constraint->type_parameter;
140 my $instance = CORE::shift;
141 $container_type_constraint->check($_)
144 . " did not pass container type constraint '$container_type_constraint'"
146 CORE::unshift @{ $reader->($instance) } => @_;
151 my $instance = CORE::shift;
152 CORE::unshift @{ $reader->($instance) } => @_;
158 my ( $attr, $reader, $writer ) = @_;
160 CORE::shift @{ $reader->( $_[0] ) };
165 my ( $attr, $reader, $writer ) = @_;
167 $reader->( $_[0] )->[ $_[1] ];
172 my ( $attr, $reader, $writer ) = @_;
174 $attr->has_type_constraint
175 && $attr->type_constraint->isa(
176 'Moose::Meta::TypeConstraint::Parameterized')
179 my $container_type_constraint = $attr->type_constraint->type_parameter;
181 ( $container_type_constraint->check( $_[2] ) )
183 . ( $_[2] || 'undef' )
184 . " did not pass container type constraint '$container_type_constraint'";
185 $reader->( $_[0] )->[ $_[1] ] = $_[2];
190 $reader->( $_[0] )->[ $_[1] ] = $_[2];
195 sub accessor : method {
196 my ( $attr, $reader, $writer ) = @_;
199 $attr->has_type_constraint
200 && $attr->type_constraint->isa(
201 'Moose::Meta::TypeConstraint::Parameterized')
204 my $container_type_constraint = $attr->type_constraint->type_parameter;
208 if ( @_ == 1 ) { # reader
209 return $reader->($self)->[ $_[0] ];
211 elsif ( @_ == 2 ) { # writer
212 ( $container_type_constraint->check( $_[1] ) )
214 . ( $_[1] || 'undef' )
215 . " did not pass container type constraint '$container_type_constraint'";
216 $reader->($self)->[ $_[0] ] = $_[1];
219 confess "One or two arguments expected, not " . @_;
227 if ( @_ == 1 ) { # reader
228 return $reader->($self)->[ $_[0] ];
230 elsif ( @_ == 2 ) { # writer
231 $reader->($self)->[ $_[0] ] = $_[1];
234 confess "One or two arguments expected, not " . @_;
241 my ( $attr, $reader, $writer ) = @_;
243 @{ $reader->( $_[0] ) } = ();
247 sub delete : method {
248 my ( $attr, $reader, $writer ) = @_;
250 CORE::splice @{ $reader->( $_[0] ) }, $_[1], 1;
254 sub insert : method {
255 my ( $attr, $reader, $writer ) = @_;
257 $attr->has_type_constraint
258 && $attr->type_constraint->isa(
259 'Moose::Meta::TypeConstraint::Parameterized')
262 my $container_type_constraint = $attr->type_constraint->type_parameter;
264 ( $container_type_constraint->check( $_[2] ) )
266 . ( $_[2] || 'undef' )
267 . " did not pass container type constraint '$container_type_constraint'";
268 CORE::splice @{ $reader->( $_[0] ) }, $_[1], 0, $_[2];
273 CORE::splice @{ $reader->( $_[0] ) }, $_[1], 0, $_[2];
278 sub splice : method {
279 my ( $attr, $reader, $writer ) = @_;
281 $attr->has_type_constraint
282 && $attr->type_constraint->isa(
283 'Moose::Meta::TypeConstraint::Parameterized')
286 my $container_type_constraint = $attr->type_constraint->type_parameter;
288 my ( $self, $i, $j, @elems ) = @_;
289 ( $container_type_constraint->check($_) )
291 . ( defined($_) ? $_ : 'undef' )
292 . " did not pass container type constraint '$container_type_constraint'"
294 CORE::splice @{ $reader->($self) }, $i, $j, @elems;
299 my ( $self, $i, $j, @elems ) = @_;
300 CORE::splice @{ $reader->($self) }, $i, $j, @elems;
305 sub sort_in_place : method {
306 my ( $attr, $reader, $writer ) = @_;
308 my ( $instance, $predicate ) = @_;
310 die "Argument must be a code reference"
311 if $predicate && ref $predicate ne 'CODE';
316 CORE::sort { $predicate->( $a, $b ) } @{ $reader->($instance) };
319 @sorted = CORE::sort @{ $reader->($instance) };
322 $writer->( $instance, \@sorted );
334 Moose::Meta::Attribute::Native::MethodProvider::Array
340 use Moose::AttributeHelpers;
345 isa => 'ArrayRef[Str]',
346 default => sub { [] },
349 all_options => 'elements',
350 map_options => 'map',
351 filter_options => 'grep',
352 find_option => 'find',
353 first_option => 'first',
354 last_option => 'last',
356 join_options => 'join',
357 count_options => 'count',
358 do_i_have_options => 'empty',
359 sorted_options => 'sort',
368 This is a role which provides the method generators for
369 L<Moose::Meta::Attribute::Trait::Native::Array>. Please check there for documentation on what methods are provided.
381 All complex software has bugs lurking in it, and this module is no
382 exception. If you find a bug please either email me, or add the bug
387 Stevan Little E<lt>stevan@iinteractive.comE<gt>
389 =head1 COPYRIGHT AND LICENSE
391 Copyright 2007-2009 by Infinity Interactive, Inc.
393 L<http://www.iinteractive.com>
395 This library is free software; you can redistribute it and/or modify
396 it under the same terms as Perl itself.