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