1

我需要使用 Moose 对象进行多方法调度。我正在使用Class::Multimethods::Pure进行此操作。我选择了这个而不是MooseX::MultiMethods,因为它依赖于MooseX::Method::Signatures,它无法安装在我的系统上,因为它没有通过测试。我不介意您是否有其他建议方法。

以下适用于类型和子类型:

package Foo::Type;
use Moose;

package Foo::SubType;
use Moose;
extends 'Foo::Type';

package main;
use Class::Multimethods::Pure;

multi hello => ('Foo::Type') => sub {
    my ( $foo ) = @_;
    print $foo;
};

hello( Foo::SubType->new );

但是我现在需要处理的场景是声明的类型实际上是 Moose 角色:

package Foo::Role;
use Moose::Role;

package Foo::Type;
use Moose;
with 'Foo::Role';

package main;
use Class::Multimethods::Pure;

multi hello => ('Foo') => sub {
    my ( $foo ) = @_;
    print $foo;
};

hello( Foo::Type->new );

但这无法识别角色:

No method found for args (Foo::Type=HASH(0x22ac854))

文档说它可以通过各种方式进行扩展,包括添加 Perl 6-ish 角色。但这对我来说有点粗略,我正在寻找一个更详细的例子。有没有人试过这个?

4

1 回答 1

0

我的解决方案是使用MooseX::ABC将角色转换为抽象基类。这样,它们就可以被识别为一个类类型。

顺便说一句,我设法让 MooseX::MultiMethods 在另一个系统上工作。它确实适用于角色,但如果我们定义一个采用类的多方法和另一个采用角色的多方法,它无法确定使用哪个。顺便说一句,MooseX::ABC 也解决了这个问题,因为它给了我一个角色实际上没有的层次结构。

package Foo::Role;
use Moose::Role;

package Foo::Type;
use Moose;
with 'Foo::Role';

package Merger;
use Moose;
use MooseX::MultiMethods;

multi method hello (Foo::Role $foo) {
    print 'Foo::Role: '.$foo;
}
multi method hello (Foo::Type $foo) {
    print 'Foo::Type: '.$foo;
}

package main;
my $merger = Merger->new;
my $f = Foo::Type->new;
$merger->hello( $f );
# Ambiguous match for multi method hello: (Foo::Role $foo), (Foo::Type $foo) 
# with value [ Merger{  }, Foo::Type{  } ]
于 2012-03-22T01:25:10.537 回答