2011-10-05 54 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