2012-03-21 2 views
1

私はMooseオブジェクトでマルチメソッドディスパッチが必要です。私は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); 

しかし、これは」することができます役割を認識する:

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

documentationは、エクステンションPerl 6-ishロールの追加など、さまざまな方法で実行できます。しかし、それは私のために少し不気味であり、私はより詳細な例を探しています。誰もこれを試しましたか?

答えて

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{ } ] 
関連する問題