Как мне получить все аргументы, передаваемые методу с помощью 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, но без значительного замедления.

Другие вопросы по тегам