2012-03-21 93 views
1

我需要multemethod調度與駝鹿對象。我正在用Class::Multimethods::Pure這樣做。我選擇了這個而不是MooseX::MultiMethods,因爲它取決於MooseX::Method::Signatures,它不能在我的系統上安裝,因爲它未通過測試。我不介意你是否有其他方法可以提出建議。如何擴展Class :: Multimethods :: Pure來識別駝鹿角色?

罰款型和亞型以下工作:

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

不過問題我現在需要處理的就是聲明的類型實際上是一個木角色:

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

但可以」 t認識到角色:

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

documentation說它可以擴展d以各種方式,包括添加Perl 6-ish角色。但對我來說有些粗略,我正在尋找更詳細的示例。有沒有人試過這個?

回答

0

我的解決方案是使用MooseX::ABC將角色轉換爲抽象基類。通過這種方式,他們可以被認爲是一種班級類型。

在附註中,我設法讓MooseX :: MultiMethods在另一個系統上工作。它可以與角色一起工作,但如果我們定義一個採用該類的multimethod和另一個採用該角色的multimethod,則無法找出使用哪個方法。順便說一句,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{ } ]