Bump to 0.14
[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;
128 CORE::splice @{$self->$reader()}, $i, $j, @elems;
129 };
130 }
131 else {
132 return sub {
133 my ( $self, $i, $j, @elems ) = @_;
134 CORE::splice @{$self->$reader()}, $i, $j, @elems;
135 };
136 }
137}
138
b9dc8e2f 1391;
140
141__END__
142
143=pod
144
5431dff2 145=head1 NAME
146
147MooseX::AttributeHelpers::MethodProvider::Array
148
149=head1 DESCRIPTION
150
151This is a role which provides the method generators for
152L<MooseX::AttributeHelpers::Collection::Array>.
153
154=head1 METHODS
155
156=over 4
157
158=item B<meta>
159
160=back
161
162=head1 PROVIDED METHODS
163
457dc4fb 164This module also consumes the B<List> method providers, to
165see those provied methods, refer to that documentation.
5431dff2 166
457dc4fb 167=over 4
5431dff2 168
169=item B<get>
170
5431dff2 171=item B<pop>
172
173=item B<push>
174
175=item B<set>
176
177=item B<shift>
178
179=item B<unshift>
180
8cf40f80 181=item B<clear>
182
b91f57af 183=item B<delete>
184
185=item B<insert>
186
331e1af0 187=item B<splice>
188
5431dff2 189=back
190
191=head1 BUGS
192
193All complex software has bugs lurking in it, and this module is no
194exception. If you find a bug please either email me, or add the bug
195to cpan-RT.
196
197=head1 AUTHOR
198
199Stevan Little E<lt>stevan@iinteractive.comE<gt>
200
201=head1 COPYRIGHT AND LICENSE
202
99c62fb8 203Copyright 2007-2008 by Infinity Interactive, Inc.
5431dff2 204
205L<http://www.iinteractive.com>
206
207This library is free software; you can redistribute it and/or modify
208it under the same terms as Perl itself.
209
b9dc8e2f 210=cut