2009-09-22 6 views
3

다음 코드는 MooseX::AttributeHelpers과 함께 제공되는 기능을 사용하는지 여부 만 다른 두 클래스 (DeckADeckB)를 정의합니다. DeckB에 대해 Moose가 생성 한 getters는 내가 예상 한 것이 아닙니다. 이것은 버그입니까, 아니면 내가 어떻게 MooseX::AttributeHelpersMooseX::FollowPBP이 상호 작용해야하는지 오해하고 있습니까?MooseX :: AttributeHelpers와 MooseX :: FollowPBP가 올바르게 상호 작용합니까?

지금 당장은 이러한 상황에서 is 인수를 사용하지 말고 필요에 따라 readerwriter을 선언하십시오.

use strict; 
use warnings; 

my %moose_args = (
    isa  => 'ArrayRef[Str]', 
    is  => 'ro', 
    default => sub {[]}, 
); 

my %moose_attr_helper_args = (
    metaclass => 'Collection::Array', 
    provides => { 
     elements => 'get_all_cards', 
    }, 
); 

package DeckA; 
use Moose; 
use MooseX::FollowPBP; 
use MooseX::AttributeHelpers; 
has 'cards' => (%moose_args); 

package DeckB; 
use Moose; 
use MooseX::FollowPBP; 
use MooseX::AttributeHelpers; 
has 'cards' => (%moose_args, %moose_attr_helper_args); 

package main; 
for my $class (qw(DeckA DeckB)){ 
    my $deck = $class->new; 
    print "\n$class\n"; 
    for my $method (qw(cards get_cards get_all_cards)){ 
     print "$method: ", $deck->can($method) ? 'yes' : 'no', "\n"; 
    } 
} 

출력 :

DeckA 
cards: no 
get_cards: yes 
get_all_cards: no 

DeckB 
cards: yes   # Not what I expected. 
get_cards: no  # Not what I expected. 
get_all_cards: yes 

답변

6

당신은 MX의 메타 클래스 옵션을 사용할 때 그들은 :: 작동하지 않습니다 AH.

그러나 최신 Moose는 약간 조정 된 API를 사용하여 기본 도우미에 대한 지원을 통합했습니다. 이 버전은 특성 (특성에 적용되는 역할)을 사용하며 MX :: FollowPBP와 잘 작동합니다.

+0

당신은이 대답에 나를 때리면 ... 데이브 롤 스키 (Dave Rolsky)를 저주하십시오. CURSE YOUUUUU – perigrin

1

나는 동일한 문제가있어서 FM의 질문과 Dave Rolsky의 대답에 정말 감사드립니다. 내 간단한 자기가 그것을 내가 그것을 읽고 처음으로 이해 한 것이다 그래야 그의 대답의 일부를 다른 표현

:

대신 MooseX :: AttributeHelpers를 사용하여, 당신은 단순히 최신 버전에서 "특성"을 사용할 수 있습니다 무스. 이것은 MooseX :: FollowPBP와의 충돌을 제거하면서도 동일한 기능을 제공합니다.

특성 사용에 대해서는 Moose :: Meta :: Attribute :: Native를 참조하십시오.

관련 문제