以下代码定义了两个类(DeckA
和DeckB
),它们的区别仅在于它们是否使用MooseX::AttributeHelpers附带的功能。 Moose为DeckB
生成的getter不是我所期望的。这是一个错误,还是我误解了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
答案 0 :(得分:6)
当您使用MX :: AH的元类选项时,它们不起作用。
然而,最新的Moose已经集成了对原生助手的支持,并略微调整了API。此版本使用traits(应用于属性的角色),它应该可以正常使用MX :: FollowPBP。
答案 1 :(得分:1)
我遇到了同样的问题,所以我非常感谢FM的问题和Dave Rolsky的回答。
重写他的部分答案,以便我的第一次阅读时我的简单自我会理解:
您可以在最新版本的Moose中使用“traits”,而不是使用MooseX :: AttributeHelpers。这消除了与MooseX :: FollowPBP的冲突,同时仍然提供相同的功能。
有关使用特征的信息,请参阅Moose :: Meta :: Attribute :: Native。