2012-03-21 4 views
1

무스 오브젝트로 멀티 메쏘드 디스패치가 필요합니다. 나는 Class::Multimethods::Pure으로 이것을하고있다. 나는 MooseX::MultiMethods 대신에 이것을 선택했습니다. 왜냐하면 테스트에 실패했기 때문에 내 시스템에 설치할 수없는 MooseX::Method::Signatures에 의존하기 때문입니다. 당신이 제안 할 수있는 대체 접근법이 있다면 나는 상관하지 않습니다. 확장하는 방법 :: 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); 

그러나 선언 된 유형이 실제로 무스 역할입니다 지금 처리해야하는 시나리오는 다음과 같습니다 '

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{ } ]