3

次のコードは、 MooseX :: AttributeHelpersに付属する機能を使用するかどうかのみが異なる2つのクラス(DeckAおよび)を定義します。Mooseによって生成されたゲッターは私が期待したものではありません。これはバグですか、それともMooseX::AttributeHelpersMooseX::FollowPBPがどのように相互作用するべきか誤解していますか?DeckBDeckB

今のところ私の回避策は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
4

2 に答える 2

6

MX::AH に metaclass オプションを使用すると、これらは機能しません。

ただし、最新の Moose にはネイティブ ヘルパーのサポートが統合されており、API がわずかに調整されています。このバージョンは特性 (属性に適用されるロール) を使用しており、MX::FollowPBP で問題なく動作するはずです。

于 2009-09-22T18:25:04.113 に答える
1

私も同じ問題を抱えていたので、FM さんの質問と Dave Rolsky さんの回答に本当に感謝しています。

彼の答えの一部を言い換えて、私の単純な自分が最初に読んだときにそれを理解できるようにします。

MooseX::AttributeHelpers を使用する代わりに、Moose の最新バージョンで単に「特性」を使用できます。これにより、MooseX::FollowPBP との競合が解消され、同じ機能が引き続き提供されます。

トレイトの使用については、Moose::Meta::Attribute::Native を参照してください。

于 2009-11-20T16:24:24.043 に答える