2011-10-05 8 views
4

sayの機能をStringに追加したいとしましょう(注:これは現実よりも簡単な例です)だから私は持っていたムース型形質の新しいハンドルを実装するにはどうしたらいいですか?

has foo => (
    isa => 'Str', 
    traits => [ 'String' ], 
    handles => { 
    say_foo => 'say', 
    } 
); 

それは私がもちろん使用することができるでしょう。私はサブルーチンがこの

sub _say_attr { 
    my ($self, $attr) = @_; 
    say $attr; 
} 

ようなものになるだろうと想像文字通り

'bar\n' 

を印刷し

$self->foo('bar'); 

$self->say_foo; 

誰も私が私が実際にこれを実装する方法を上のギャップを埋める手助けすることはできますか?私は実際にあなた自身の書き込み方法についてのドキュメントの方法で多くを見ていませんhandles

私は実際にString形質を変更する方法を知る必要はありません。私が現在のアトリビュートの名前を知る必要がないジェネリックハンドラを使用できるようにするためには、現在のアトリビュートの名前を知る必要はありません。ここ

has foo => (
    isa => 'Str', 
    traits => [ 'PrintString' ], 
    handles => { 
     say_foo => 'say', 
    } 
); 
has bar => (
    isa => 'Str', 
    traits => [ 'PrintString' ], 
    handles => { 
     say_bar => 'say', 
    } 
); 

のでsayおそらくそれを呼び出している属性のハードコードされた名前を必要としない機能のための識別子です。

答えて

2

sayStringに追加しますか、say_foofooを追加することに満足していますか?それはあなたが、より一般的な解決策を望んでいた場合、あなたはMoose::Meta::Attribute::Native::Trait::Stringを見なければならないとコピー/ラップ/サブクラス

has foo => (
    isa => 'Str', 
    traits => [ 'String' ], 
    handles => { 
    say_foo => sub { say $_[0]->foo; }, 
    } 
); 

ではなく、それを変更しようとしている:

後者は簡単です。

+0

私は言いたいことはありません...文字列を変更する...しかし、私は一般的にこの動作を複数の属性に適用できるように、属性の名前を知りたくありません。 – xenoterracide

+0

も更新された質問です。 – xenoterracide

+0

@xenotarracide次に、既存の形質を覗き込み、それが何をしているかをエミュレートすることをお勧めします。私はまだ問題がある、より具体的な質問をする。 – ikegami

関連する問題