Perl 如何扩展Class::Multimethods::Pure以识别Moose角色?

Perl 如何扩展Class::Multimethods::Pure以识别Moose角色?,perl,moose,multimethod,Perl,Moose,Multimethod,我需要用驼鹿的东西用multemethod发送。我是和你一起做的。我选择了这个,而不是因为它取决于无法在我的系统上安装的,因为它没有通过测试。我不介意你是否有别的建议 以下内容适用于类型和子类型: package Foo::Type; use Moose; package Foo::SubType; use Moose; extends 'Foo::Type'; package main; use Class::Multimethods::Pure; multi hello => (

我需要用驼鹿的东西用multemethod发送。我是和你一起做的。我选择了这个,而不是因为它取决于无法在我的系统上安装的,因为它没有通过测试。我不介意你是否有别的建议

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

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))

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

我的解决方案是使用将角色转换为抽象基类。通过这种方式,它们可以被识别为类类型

另一方面,我设法让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{  } ]