代码之家  ›  专栏  ›  技术社区  ›  FMc TLP

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

  •  3
  • FMc TLP  · 技术社区  · 16 年前

    下面的代码定义了两个类( DeckA DeckB MooseX::AttributeHelpers . Moose为 德克 这不是我所期望的。这是一个错误还是我误解了 穆塞克斯:属性帮助者 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 回复  |  直到 16 年前
        1
  •  6
  •   Dave Rolsky    16 年前

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

    然而,最新的Moose集成了对本地助手的支持,并稍微调整了API。这个版本使用traits(一个应用于属性的角色),它应该可以很好地与MX::FollowPBP配合使用。

        2
  •  1
  •   Community Mohan Dere    6 年前

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

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

    有关使用特征的信息,请参见Moose::Meta::Attribute::Native。