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