splice was totally broken, add tests and fix it
[gitmo/MooseX-AttributeHelpers.git] / lib / MooseX / AttributeHelpers / MethodProvider / Array.pm
CommitLineData
b9dc8e2f 1package MooseX::AttributeHelpers::MethodProvider::Array;
2use Moose::Role;
3
7a93b96e 4our $VERSION = '0.14';
38430345 5$VERSION = eval $VERSION;
457dc4fb 6our $AUTHORITY = 'cpan:STEVAN';
7
8with 'MooseX::AttributeHelpers::MethodProvider::List';
9
b9dc8e2f 10sub push : method {
457dc4fb 11 my ($attr, $reader, $writer) = @_;
12
9a976497 13 if ($attr->has_type_constraint && $attr->type_constraint->isa('Moose::Meta::TypeConstraint::Parameterized')) {
14 my $container_type_constraint = $attr->type_constraint->type_parameter;
b9dc8e2f 15 return sub {
16 my $instance = CORE::shift;
17 $container_type_constraint->check($_)
18 || confess "Value " . ($_||'undef') . " did not pass container type constraint"
19 foreach @_;
457dc4fb 20 CORE::push @{$reader->($instance)} => @_;
b9dc8e2f 21 };
22 }
23 else {
24 return sub {
25 my $instance = CORE::shift;
457dc4fb 26 CORE::push @{$reader->($instance)} => @_;
b9dc8e2f 27 };
28 }
29}
30
31sub pop : method {
457dc4fb 32 my ($attr, $reader, $writer) = @_;
b9dc8e2f 33 return sub {
457dc4fb 34 CORE::pop @{$reader->($_[0])}
b9dc8e2f 35 };
36}
37
38sub unshift : method {
457dc4fb 39 my ($attr, $reader, $writer) = @_;
9a976497 40 if ($attr->has_type_constraint && $attr->type_constraint->isa('Moose::Meta::TypeConstraint::Parameterized')) {
41 my $container_type_constraint = $attr->type_constraint->type_parameter;
b9dc8e2f 42 return sub {
43 my $instance = CORE::shift;
44 $container_type_constraint->check($_)
45 || confess "Value " . ($_||'undef') . " did not pass container type constraint"
46 foreach @_;
457dc4fb 47 CORE::unshift @{$reader->($instance)} => @_;
b9dc8e2f 48 };
49 }
50 else {
51 return sub {
52 my $instance = CORE::shift;
457dc4fb 53 CORE::unshift @{$reader->($instance)} => @_;
b9dc8e2f 54 };
55 }
56}
57
58sub shift : method {
457dc4fb 59 my ($attr, $reader, $writer) = @_;
b9dc8e2f 60 return sub {
457dc4fb 61 CORE::shift @{$reader->($_[0])}
b9dc8e2f 62 };
63}
64
65sub get : method {
457dc4fb 66 my ($attr, $reader, $writer) = @_;
b9dc8e2f 67 return sub {
457dc4fb 68 $reader->($_[0])->[$_[1]]
b9dc8e2f 69 };
70}
71
72sub set : method {
457dc4fb 73 my ($attr, $reader, $writer) = @_;
9a976497 74 if ($attr->has_type_constraint && $attr->type_constraint->isa('Moose::Meta::TypeConstraint::Parameterized')) {
75 my $container_type_constraint = $attr->type_constraint->type_parameter;
b9dc8e2f 76 return sub {
77 ($container_type_constraint->check($_[2]))
78 || confess "Value " . ($_[2]||'undef') . " did not pass container type constraint";
457dc4fb 79 $reader->($_[0])->[$_[1]] = $_[2]
b9dc8e2f 80 };
81 }
82 else {
83 return sub {
457dc4fb 84 $reader->($_[0])->[$_[1]] = $_[2]
b9dc8e2f 85 };
86 }
87}
b91f57af 88
89sub clear : method {
90 my ($attr, $reader, $writer) = @_;
91 return sub {
92 @{$reader->($_[0])} = ()
93 };
94}
95
96sub delete : method {
97 my ($attr, $reader, $writer) = @_;
98 return sub {
99 CORE::splice @{$reader->($_[0])}, $_[1], 1;
100 }
101}
102
103sub insert : method {
104 my ($attr, $reader, $writer) = @_;
9a976497 105 if ($attr->has_type_constraint && $attr->type_constraint->isa('Moose::Meta::TypeConstraint::Parameterized')) {
106 my $container_type_constraint = $attr->type_constraint->type_parameter;
b91f57af 107 return sub {
108 ($container_type_constraint->check($_[2]))
109 || confess "Value " . ($_[2]||'undef') . " did not pass container type constraint";
9a976497 110 CORE::splice @{$reader->($_[0])}, $_[1], 0, $_[2];
b91f57af 111 };
112 }
113 else {
114 return sub {
9a976497 115 CORE::splice @{$reader->($_[0])}, $_[1], 0, $_[2];
b91f57af 116 };
117 }
118}
331e1af0 119
120sub splice : method {
121 my ($attr, $reader, $writer) = @_;
122 if ($attr->has_type_constraint && $attr->type_constraint->isa('Moose::Meta::TypeConstraint::Parameterized')) {
123 my $container_type_constraint = $attr->type_constraint->type_parameter;
124 return sub {
125 my ( $self, $i, $j, @elems ) = @_;
126 ($container_type_constraint->check($_))
127 || confess "Value " . (defined($_) ? $_ : 'undef') . " did not pass container type constraint" for @elems;
af1ade48 128 CORE::splice @{$reader->($self)}, $i, $j, @elems;
331e1af0 129 };
130 }
131 else {
132 return sub {
133 my ( $self, $i, $j, @elems ) = @_;
af1ade48 134 CORE::splice @{$reader->($self)}, $i, $j, @elems;
331e1af0 135 };
136 }
137}
138
80894c0a 139sub sort_in_place : method {
71703b28 140 my ($attr, $reader, $writer) = @_;
141 return sub {
142 my ($instance, $predicate) = @_;
143
144 die "Argument must be a code reference"
145 if $predicate && ref $predicate ne 'CODE';
146
147 my @sorted;
148 if ($predicate) {
149 @sorted = CORE::sort { $predicate->($a, $b) } @{$reader->($instance)};
150 }
151 else {
152 @sorted = CORE::sort @{$reader->($instance)};
153 }
154
155 $writer->($instance, \@sorted);
156 };
80894c0a 157}
158
b9dc8e2f 1591;
160
161__END__
162
163=pod
164
5431dff2 165=head1 NAME
166
167MooseX::AttributeHelpers::MethodProvider::Array
71703b28 168
5431dff2 169=head1 DESCRIPTION
170
171This is a role which provides the method generators for
172L<MooseX::AttributeHelpers::Collection::Array>.
173
174=head1 METHODS
175
176=over 4
177
178=item B<meta>
179
180=back
181
182=head1 PROVIDED METHODS
183
457dc4fb 184This module also consumes the B<List> method providers, to
185see those provied methods, refer to that documentation.
5431dff2 186
457dc4fb 187=over 4
5431dff2 188
189=item B<get>
190
5431dff2 191=item B<pop>
192
193=item B<push>
194
195=item B<set>
196
197=item B<shift>
198
199=item B<unshift>
200
8cf40f80 201=item B<clear>
202
b91f57af 203=item B<delete>
204
205=item B<insert>
206
331e1af0 207=item B<splice>
208
80894c0a 209=item B<sort_in_place>
71703b28 210
211Sorts the array I<in place>, modifying the value of the attribute.
212
213You can provide an optional subroutine reference to sort with (as you
214can with the core C<sort> function). However, instead of using C<$a>
215and C<$b>, you will need to use C<$_[0]> and C<$_[1]> instead.
80894c0a 216
5431dff2 217=back
218
219=head1 BUGS
220
221All complex software has bugs lurking in it, and this module is no
222exception. If you find a bug please either email me, or add the bug
223to cpan-RT.
224
225=head1 AUTHOR
226
227Stevan Little E<lt>stevan@iinteractive.comE<gt>
228
229=head1 COPYRIGHT AND LICENSE
230
99c62fb8 231Copyright 2007-2008 by Infinity Interactive, Inc.
5431dff2 232
233L<http://www.iinteractive.com>
234
235This library is free software; you can redistribute it and/or modify
236it under the same terms as Perl itself.
237
b9dc8e2f 238=cut