BEGIN {
signature_for
myfunc
=> (
method
=> Object | Str,
named
=> [
arr
=> ArrayRef,
int
=> Int ],
);
sub
myfunc {
my
(
$self
,
$arg
) =
@_
;
return
$arg
->arr->[
$arg
->
int
];
}
my
$signature
;
sub
myfunc2 {
$signature
||= signature(
method
=> 1,
named
=> [
arr
=> ArrayRef,
int
=> Int ],
);
my
(
$self
,
$arg
) =
&$signature
;
return
$arg
->arr->[
$arg
->
int
];
}
};
my
$o
=
bless
{} =>
'Local::MyPackage'
;
my
@arr
= (
'a'
..
'z'
);
is
$o
->myfunc(
arr
=> \
@arr
,
int
=> 2 ),
'c'
,
'myfunc (happy path)'
;
is
$o
->myfunc2(
arr
=> \
@arr
,
int
=> 4 ),
'e'
,
'myfunc2 (happy path)'
;
{
my
$e
= exception {
$o
->myfunc(
arr
=> \
@arr
,
int
=>
undef
);
};
like
$e
,
qr/Undef did not pass type constraint "Int"/
,
'myfunc (type exception)'
}
{
my
$e
= exception {
$o
->myfunc2(
arr
=> \
@arr
,
int
=>
undef
);
};
like
$e
,
qr/Undef did not pass type constraint "Int"/
,
'myfunc2 (type exception)'
}
{
my
$e
= exception {
$o
->myfunc(
arr
=> \
@arr
,
int
=> 6,
'debug'
);
};
like
$e
,
qr/Wrong number of parameters/
,
'myfunc (param count exception)'
}
{
my
$e
= exception {
$o
->myfunc2(
arr
=> \
@arr
,
int
=> 8,
'debug'
);
};
like
$e
,
qr/Wrong number of parameters/
,
'myfunc2 (param count exception)'
}
done_testing;