1

Mooseオブジェクトを使用したmultemethodディスパッチが必要です。私はこれをClass::Multimethods::Pureで行っています。MooseX :: Method :: Signaturesに依存しているため、 MooseX :: MultiMethodsの代わりにこれを選択しました。これは、テストに失敗したためにシステムにインストールできません。提案する別のアプローチがあるかどうかは気にしません。

以下は、タイプとサブタイプで正常に機能します。

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風の役割の追加など、さまざまな方法で拡張できると記載されています。しかし、それは私には少し大雑把であり、私はより詳細な例を探しています。誰かがこれを試しましたか?

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 に答える