2011-10-05 63 views
4

可以说我想添加say功能到String(注意:这是一个比现实更简单的例子)。所以我可以有我怎样才能实现一个驼鹿型特征的新手柄?

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

然后我当然可以用它来做。

$self->foo('bar'); 

$self->say_foo; 

这将打印字面上

'bar\n' 

我想象中的子程序会是这样的

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

谁能帮我填,我怎么可能真正实现这个差距?我没有看到关于如何编写自己的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

后者很简单:

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

如果你想更广泛的解决方案,你应该看看Moose::Meta::Attribute::Native::Trait::String和复制/包装/,而不是试图去改变它继承它。

+0

没有那么多,我需要说...修改字符串...但我不想知道该属性的名称,所以我可以将此行为一般应用于多个属性。 – xenoterracide

+0

也更新了问题。 – xenoterracide

+0

@xenotarracide,然后我建议你先看看现有的特征并模拟它的功能。我仍然有问题,然后问一个更具体的问题。 – ikegami