2010-08-31 53 views
3

讓我們說你有需要,做一個角色的屬性,一個木類:檢查對非穆斯類駝鹿作用

package MyMooseClass; 
use Moose; 

has 'a' => (does => 'MyRole'); 

現在,我想建立一個像MyMooseClass的實例this:

my $instance = MyMooseClass->new({ a => $a_non_moose_stuff }); 

其中$ a_non_moose_stuff是非moose類的實例,但實現了所需的角色方法。

有沒有辦法讓Moose檢查我的$ a_non_moose_stuff是否符合角色,即使它沒有使用Moose實現?

回答

5

最簡單的事情是使用duck_type而不是角色來驗證您的界面。 duck_type是一個寬鬆的限制,基本上duck_type只是該對象預期擁有的一系列方法。例如:

package MyMooseClass; 
use Moose; 
use Moose::Util::TypeConstraints qw/duck_type/; 

has 'a' => (
    isa => duck_type(qw/method1 method1 some_other_method/), 
); 

Moose::Util::TypeConstraints並直到你看到duck_type入口稍微向下滾動。這個限制是專門爲處理這類問題而添加的。

如果您打算重複使用這個約束條件,您可能需要考慮在類庫類中創建它,這將促進重用。檢出MooseX::Types

順便說一句,雖然在構造函數中使用Hash引用是受支持的,並且在Moose認爲是最佳實踐之前的很長一段時間,我知道大多數Moose作者會跳過它並僅提供構造函數參數列表。它少了幾分打字,看起來比較清爽,在我看來:

my $instance = MyClass->new(param1=>'val1', param2=>'val2'); 

哈希參考方法的要點是幫助解決一些模糊之處,真正當您使用穆斯來構建你的Perl的對象不會發生。由於穆斯爲你處理所有的樣板和儀式,所以我認爲沒有必要,儘管樣式有所不同。我的兩分錢。

別緊張,

約翰

+0

的感謝!正是我需要的。也許我甚至可以把一個角色變成一個ductype :) – jeje 2010-09-01 08:20:44

+0

Yep'duck_type'是作爲一種廉價的方式添加的,不必在CPAN上派生和子類化非Moose類,因此可以針對某些API進行檢查。 (編輯:我需要學習閱讀。) – perigrin 2010-09-01 09:41:32