【问题标题】:Do MooseX::AttributeHelpers and MooseX::FollowPBP interact correctly?MooseX::AttributeHelpers 和 MooseX::FollowPBP 是否正确交互?
【发布时间】:2009-09-22 16:56:25
【问题描述】:

以下代码定义了两个类(DeckADeckB),它们的区别仅在于它们是否使用MooseX::AttributeHelpers 附带的功能。 Moose 为DeckB 生成的吸气剂不是我所期望的。这是一个错误还是我误解了MooseX::AttributeHelpersMooseX::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

【问题讨论】:

    标签: perl moose


    【解决方案1】:

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

    不过,最新的 Moose 集成了对原生帮助程序的支持,并稍微调整了 API。此版本使用特征(应用于属性的角色),它应该可以很好地与 MX::FollowPBP 一起使用。

    【讨论】:

    • 你在这个答案上打败了我......诅咒你 Dave Rolsky......诅咒 YOUUUUU
    【解决方案2】:

    我遇到了同样的问题,所以非常感谢 FM 的问题和 Dave Rolsky 的回答。

    改写他的部分答案,以便我简单的自己在第一次阅读时就能理解:

    您可以在最新版本的 Moose 中简单地使用“特征”,而不是使用 MooseX::AttributeHelpers。这消除了与 MooseX::FollowPBP 的冲突,同时仍为您提供相同的功能。

    有关使用特征,请参阅 Moose::Meta::Attribute::Native。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-24
      • 1970-01-01
      • 2011-09-04
      • 1970-01-01
      • 2011-03-31
      • 1970-01-01
      相关资源
      最近更新 更多