2010-10-31 57 views
5

我有一個Moose::Role,我想,當該角色被應用於類來調用類的一些額外的潛艇。Moose :: Role - 增加角色應用的簡單方法?

有一種簡單的方法來修改當施加作用,而不必挖進過多Moose::Meta::Role類型編碼會發生什麼?理想情況下,我只想after 'apply' => ...添加額外的東西。

編輯:我專門用這個帶有DBIx::Class::Core結果定義來創建類似的東西還修改構造一個組件

。我只想把它寫成一個組成部分,如果我能在BUILDARGSBUILD潛艇的結果得到的,但我似乎無法做到。所以,與其做load_component,我做with 'role',但一些成分的作用是belongs_to關係添加到類。因此,我認爲最好的方式就是在將角色應用到課堂上。

+1

你能澄清多一點你想做什麼?你會在你的假設''apply''後添加什麼?對MOP的這種修補通常不會完成,所以幾乎肯定會有一種更簡單的方法來完成你想要做的事情。 – Ether 2010-10-31 17:53:11

+0

@Ether:當然,編輯多一點解釋。 – Carl 2010-10-31 18:23:14

+0

您是否在BUILD => sub {...}'之後嘗試過'在您的角色中? – Ether 2010-10-31 18:33:07

回答

0

我發現那是什麼工作,結構緊湊,而且似乎在文檔意圖一致地使用特質來修改我的特定角色所使用的元角色:

package DBIx::Class::Meta::Role::MyRole; 
use Moose; 
BEGIN { extends 'Moose::Meta::Role'; } 
after 'apply' => sub { 
## ..my mods to add extra relationships to DBIx::Class::Core result 
}; 
no Moose; 

package DBIx::Class::MyRole; 
use Moose::Role -metaclass => 'DBIx::Class::Meta::Role::MyRole'; 
1

你可以使用一個parameterized role。有一個關於如何訪問tutorial中的消費類的例子。這就是說,我建議你加入Moose和DBIx-Class IRC頻道或郵件列表,以尋找這方面的最佳做法。

4

在短暫的評論中,我提到了this question,它討論瞭如何訪問角色正在應用的類的元類(例如,您可以有條件地構建到類上)。然而,這是一個非常臭的使用MooseX :: Role :: Parameterized提供給你的信息,如果角色被應用到另一個角色而不是一個類,它也不會工作。

作爲替代方案,你可以寫接收元信息糖功能,並以這種方式建立到類:

sub foo 
{ 
    my ($meta, %options) = @_; 

    # based on what is present in %options, add additional attributes... 
    $meta->add_attribute(...); 
} 

編寫糖功能的一個例子見Moose::Cookbook::Extending::Recipe4

+0

你如何使用特質修改Moose :: Meta :: Role?這在文檔中被描述爲對元角色進行簡單修改的​​方式。 – Carl 2010-10-31 21:47:16