Как расширить Class :: Multimethods :: Pure для распознавания ролей лося? - PullRequest
1 голос
/ 21 марта 2012

Мне нужна отправка мультиметода с объектами Moose.Я делаю это с Class :: Multimethods :: Pure .Я выбрал это вместо MooseX :: MultiMethods , потому что это зависит от MooseX :: Method :: Signatures , который не может быть установлен в моей системе, потому что он не проходит свои тесты.Я не возражаю, если у вас есть альтернативный подход к предложению.

С типами и подтипами хорошо работает следующее:

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 Role:

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-ти ролей.Но это немного отрывочно для меня, и я ищу более подробный пример.Кто-нибудь пробовал это?

1 Ответ

0 голосов
/ 22 марта 2012

Моим решением было преобразовать роли в абстрактные базовые классы, используя 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{  } ]
...