Как мне получить все аргументы, передаваемые методу с помощью MooseX::Method::Signatures?
Если я использую MooseX::Method::Signatures
и я хочу передать все аргументы во второй метод, я должен явно перечислить их снова:
method foo (Str :$bar!, Int: :$baz!) {
...
return $self->_foo2(bar => $bar, baz => $baz);
}
Было бы хорошо, если бы я мог сделать что-то вроде:
method foo (Str :$bar!, Int: :$baz!) {
...
return $self->_foo2(%args);
}
Эта документация для Method::Signatures
предполагает, что я могу использовать @_
но это удаляет именованные ключи параметров.
1 ответ
Решение
После небольшого тестирования кажется, что MooseX::Method::Signatures является "нечетным" из основных реализаций сигнатур методов. Все остальные позволяют использовать @_
как и ожидалось; MXMS нет.
use strict;
use warnings;
use Test::More 0.96;
{
package MyBase;
sub new { bless {}, shift }
sub _foo { \@_ }
}
{
package UseKavorka;
use Kavorka;
use parent -norequire => qw(MyBase);
method foo (Str :$bar!, Int :$baz!) {
$self->_foo(@_);
}
}
{
package UseMS;
use Method::Signatures;
use parent -norequire => qw(MyBase);
method foo (Str :$bar!, Int :$baz!) {
$self->_foo(@_);
}
}
{
package UseMXMS;
use Moose;
use MooseX::Method::Signatures;
extends qw(MyBase);
method foo (Str :$bar!, Int :$baz!) {
$self->_foo(@_);
}
}
{
package UseFP;
use Function::Parameters;
use parent -norequire => qw(MyBase);
method foo (Str :$bar, Int :$baz) {
$self->_foo(@_);
}
}
for my $class (qw/ UseKavorka UseMS UseMXMS UseFP /)
{
my $obj = $class->new;
is_deeply(
$obj->foo(bar => "Hello world", baz => 42),
[ $obj, bar => "Hello world", baz => 42 ],
"\@_ worked fine in $class",
);
}
done_testing;
__END__
ok 1 - @_ worked fine in UseKavorka
ok 2 - @_ worked fine in UseMS
not ok 3 - @_ worked fine in UseMXMS
# Failed test '@_ worked fine in UseMXMS'
# at foo.pl line 55.
# Structures begin differing at:
# $got->[1] = UseMXMS=HASH(0x92c0cc8)
# $expected->[1] = 'bar'
ok 4 - @_ worked fine in UseFP
1..4
# Looks like you failed 1 test of 4.
Я пристрастен, потому что написал это, но мой совет - переключиться на Kavoka, которая дает вам почти все функции MooseX::Method::Signatures, но без значительного замедления.