Правильно ли взаимодействуют MooseX :: AttributeHelpers и MooseX :: FollowPBP? - PullRequest
3 голосов
/ 22 сентября 2009

Следующий код определяет два класса (DeckA и DeckB), которые отличаются только тем, используют ли они функции, поставляемые с MooseX :: AttributeHelpers . Меттеры, сгенерированные Moose для DeckB, не такие, как я ожидал. Это ошибка или я неправильно понимаю, как 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

Ответы [ 2 ]

6 голосов
/ 22 сентября 2009

Они не работают, когда вы используете опцию метакласса для MX :: AH.

Однако в новейшую версию Moose встроена поддержка нативных помощников с немного подправленным API. Эта версия использует черты (роль, примененная к атрибуту), и она должна прекрасно работать с MX :: FollowPBP.

1 голос
/ 20 ноября 2009

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

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

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

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

...