perl – MooseX :: AttributeHelpers和MooseX :: FollowPBP是否正确交互?

前端之家收集整理的这篇文章主要介绍了perl – MooseX :: AttributeHelpers和MooseX :: FollowPBP是否正确交互?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
下面的代码定义了两个类(DeckA和DeckB),它们的区别仅在于它们是否使用 MooseX::AttributeHelpers附带的功能.Moose为DeckB生成的getter不是我所期望的.这是一个错误还是我误解了 MooseX::AttributeHelpersMooseX::FollowPBP应该如何互动?

我现在的解决方法是避免在这种情况下使用is参数,而是根据需要声明读者和编写者.

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

解决方法

当您使用MX :: AH的元类选项时,它们不起作用.

然而,最新的Moose已经集成了对原生助手的支持,并略微调整了API.此版本使用traits(应用于属性的角色),它应该可以正常使用MX :: FollowPBP.

猜你在找的Perl相关文章