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