2011-09-26 72 views
2

我认为我已经为perl Natives获得了属性处理程序!如何在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

是啊,它只是一个学习练习 - 我用LinkedList作为一个简单的例子来理解Moose属性发生了什么 – 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

相关问题