2009-09-22 1 views
3

В следующем коде определяются два класса (DeckA и DeckB), которые отличаются только тем, используют ли они функции, которые поставляются с MooseX::AttributeHelpers. Геттеры, созданные Moose для DeckB, не являются тем, что я ожидал. Является ли это ошибкой или я не понимаю, как должны взаимодействовать MooseX::AttributeHelpers и MooseX::FollowPBP?Do MooseX :: AttributeHelpers и MooseX :: FollowPBP взаимодействуют правильно?

Мое обходное решение в настоящее время состояло в том, чтобы избежать использования аргумента is в таких ситуациях и вместо этого объявить reader и writer при необходимости.

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

вы избили меня до этого ответа ... проклинайте вас, Дэйв Ролски ... CURSE YOUUUUU – perigrin

1

У меня была такая же проблема, поэтому я очень ценю вопрос FM и ответ Дейва Ролски.

Перефразируя часть своего ответа, так что мой простые самостоятельно понял бы это в первый раз, когда я прочитал его:

Вместо использования MooseX :: AttributeHelpers, вы можете просто использовать «черту» в последней версии Муз. Это устраняет конфликт с MooseX :: FollowPBP, но при этом дает вам ту же функциональность.

Для использования свойств см. Moose :: Meta :: Attribute :: Native.