30259478faa10249f2709689c5d9d47394c9c18f
[gitmo/Moose.git] / lib / Moose / Meta / Method / Accessor / Native / Array / insert.pm
1 package Moose::Meta::Method::Accessor::Native::Array::insert;
2
3 use strict;
4 use warnings;
5
6 use Moose::Role;
7
8 with 'Moose::Meta::Method::Accessor::Native::Array::Writer' => {
9     -excludes => [
10         qw(
11             _minimum_arguments
12             _maximum_arguments
13             _inline_coerce_new_values
14             _new_members
15             _inline_optimized_set_new_value
16             _return_value
17             )
18     ]
19 };
20
21 sub _minimum_arguments { 2 }
22
23 sub _maximum_arguments { 2 }
24
25 sub _adds_members { 1 }
26
27 sub _potential_value {
28     my $self = shift;
29     my ($slot_access) = @_;
30
31     return '(do { '
32              . 'my @potential = @{ (' . $slot_access . ') }; '
33              . 'splice @potential, $_[0], 0, $_[1]; '
34              . '\@potential; '
35          . '})';
36 }
37
38 # We need to override this because while @_ can be written to, we cannot write
39 # directly to $_[1].
40 sub _inline_coerce_new_values {
41     my $self = shift;
42
43     return unless $self->associated_attribute->should_coerce;
44
45     return unless $self->_tc_member_type_can_coerce;
46
47     return '@_ = ($_[0], $member_coercion->($_[1]));';
48 };
49
50 sub _new_members { '$_[1]' }
51
52 sub _inline_optimized_set_new_value {
53     my $self = shift;
54     my ($inv, $new, $slot_access) = @_;
55
56     return 'splice @{ (' . $slot_access . ') }, $_[0], 0, $_[1];';
57 }
58
59 sub _return_value {
60     my $self = shift;
61     my ($slot_access) = @_;
62
63     return $slot_access . '->[ $_[0] ]';
64 }
65
66 no Moose::Role;
67
68 1;