2011-09-26 7 views
2

perlネイティブの属性ハンドラがダウンしていると思います!Perl/Mooseでオブジェクトのメソッドの属性ハンドラを作成する方法

package tree; 
     has '_branches' => (
       traits => ['Hash'], 
       is  => 'rw', 
       isa  => 'HashRef[Any]', 
       handles => { 
        _set_branch => 'set', 
        _is_branch => 'defined', 
        _list_branches => 'keys', 
        _branch => 'get' 
       }, 
       trigger => sub { 
        my($self,$hash) = @_; 
        $self->_build_branch($hash); 
       } 

    ); 


sub _build_branch{ 
    my($self,$hash); 
    # do stuff! 
    #return altered or coerced hash 
    return $hash; 
} 

あなたはどう思いますか?

しかし、のは、私は次の方法

LinkedList{} 
LinkedList.append() 
LinkedList.insert() 
LinkedList.size() 
LinkedList.has_children() 
LinkedList.remove() 
LinkedList.split() 

ムースは(MooseXを使用せずに)属性を経由して、オブジェクトのメソッドを扱う方法があるとLinkedListのオブジェクト持っ例えばとしましょう - これに類似しますか?

package Bucket; 
     has '_linkedlist' => (
       traits => ['LinkedList'], 
       is  => 'rw', 
       isa  => 'LinkedListRef[Any]', 
       handles => { 
        _add_link => 'append', 
        _insert_link => 'insert', 
        _count_links => 'size', 
        _del_link => 'remove', 
        _split_at_link => 'split', 
        _has_sublinks => 'has_children', 
       }, 

これを行う方法があった場合、それは素晴らしいことだが、私は多分私は非ネイティブ属性のハンドラを作成する方法や理由についてのどこかに何かを誤解しまし心配です。

思考?

+0

リンクリストの特性を知りたい理由はありますか(学習目的ですか)?私がこれを言うのは、 'Array'特性を持つ' ArrayRef'型があなたがそこで必要なものすべてを処理できるからです(分割を除く)。内部的には、perl配列はリンクされたリストです。しかし、あなたのクラスは特にそれを知る必要はありません。 – stevenl

+0

うん、それはちょうど学習の練習だった - 私はMoose属性で何が起こっていたかを理解するための簡単な例としてLinkedListを使用した – qodeninja

答えて

4

単純に過度に複雑になっているのですか、何か不足していますか?

package Bucket; 
has '_linkedlist' => (
    is  => 'rw', 
    isa  => 'LinkedList', 
    handles => { 
     _add_link  => 'append', 
     _insert_link => 'insert', 
     _count_links => 'size', 
     _del_link  => 'remove', 
     _split_at_link => 'split', 
     _has_sublinks => 'has_children', 
    }, 
); 

ハッシュにはメソッドがありません。そのため、ハッシュには特性が含まれています。特性によってメソッドが追加されます。 LinkedListクラスにはメソッドがあるため、メソッドを提供するための特性を記述する必要はありません。

+0

これは最初にどのように動作していたのか誤解していた – qodeninja

関連する問題