use
5.008;
note
'Local::Bleh'
;
{
has
nums
=> (
is
=>
'ro'
,
lazy
=> 1,
isa
=> ArrayRef[ Int->plus_coercions(Num,
'int($_)'
) ],
coerce
=> 1,
builder
=>
'_build_nums'
,
handles_via
=>
'Array'
,
handles
=> {
splice_nums
=>
'splice'
,
splice_nums_tap
=>
'splice...'
,
first_num
=> [
'get'
, 0 ],
},
);
sub
_build_nums { [1..2] }
}
my
$bleh
= Local::Bleh->new;
my
@r
=
$bleh
->splice_nums(0, 2, 3..5);
is_deeply(
$bleh
->nums, [3..5],
'delegated method worked'
);
is_deeply(\
@r
, [1..2],
'... and returned correct value'
);
is(
$bleh
->first_num, 3,
'curried delegated method worked'
);
my
$e
= exception {
$bleh
->splice_nums(1, 0,
"foo"
);
};
like(
$e
,
qr/Value "foo" did not pass type constraint/
,
'delegated method checked incoming types'
);
is_deeply(
$bleh
->nums, [3..5],
'... and kept the value safe'
);
my
$ref
=
$bleh
->nums;
$bleh
->splice_nums(1, 0,
'3.111'
);
is_deeply(
$bleh
->nums, [3, 3, 4, 5],
'delegated coerced value'
);
my
$ref2
=
$bleh
->nums;
isnt(
"$ref"
,
"$ref2"
,
'... but needed to build a new array'
)
or
do
{
diag( B::Deparse->new->coderef2text(\
&Local::Bleh::splice_nums
) );
};
$bleh
= Local::Bleh->new;
@r
=
$bleh
->splice_nums_tap(0, 2, 3..5);
is_deeply(
$bleh
->nums, [3..5],
'delegated method with chaining worked'
);
is_deeply(\
@r
, [
$bleh
],
'... and returned correct value'
);
note
'Local::Bleh2'
;
{
has
nums
=> (
is
=>
'ro'
,
lazy
=> 1,
isa
=> ArrayRef->of(Int->plus_coercions(Num,
'int($_)'
))->where(
'1'
,
coercion
=>1),
builder
=>
'_build_nums'
,
coerce
=> 1,
handles_via
=>
'Array'
,
handles
=> {
splice_nums
=>
'splice'
,
first_num
=> [
'get'
, 0 ],
},
);
sub
_build_nums { [] }
}
$bleh
= Local::Bleh2->new;
$bleh
->splice_nums(0, 0, 3..5);
is_deeply(
$bleh
->nums, [3..5],
'delegated method worked'
)
or
do
{
diag explain(
$bleh
->nums);
diag( B::Deparse->new->coderef2text(\
&Local::Bleh2::splice_nums
) );
};
is(
$bleh
->first_num, 3,
'curried delegated method worked'
);
$e
= exception {
$bleh
->splice_nums(1, 0,
"foo"
);
};
like(
$e
,
qr/type constraint/
,
'delegated method has to do naive type check'
)
or
do
{
diag( B::Deparse->new->coderef2text(\
&Local::Bleh::splice_nums
) );
};
is_deeply(
$bleh
->nums, [3..5],
'... and kept the value safe'
);
$ref
=
$bleh
->nums;
$bleh
->splice_nums(1, 0,
'3.111'
);
is_deeply(
$bleh
->nums, [3, 3, 4, 5],
'delegated coerced value'
);
$ref2
=
$bleh
->nums;
isnt(
"$ref"
,
"$ref2"
,
'... but sadly needed to build a new arrayref'
);
done_testing;