2010-12-17 100 views
3

反正有$self變成MooseX::Types強制?我在對象中有其他數據,我想用它來將我的強制從String接種到Object。或者,有沒有什麼像Class::MOPinitializer,這將允許我這樣做 - 它必須在之前觸發類型檢查。

請求的僞代碼:

with 'DBHandle'; 
has 'database' => (isa => 'Str', is => 'ro', default => 'Db'); 
has 'schema' => (isa => 'Str', is => 'ro', default => 'schema'); 
has 'table' => (isa => 'Str', is => 'ro', default => 'column); 

has 'columns' => (isa => DBCols, is => 'ro', default => sub {[qw/foo bar baz/]}); 

在這裏,我想 「列」 要挾到DBCols - DBCol的(對象)的數組引用 - 需要使用catalogschemacol屬性發現在課堂上,以及由DBHandle提供的dbh/singleton。

爲了減少這種僞現象,實際情況只會稍微複雜一些。我能夠完成以上around,現在我想我做的就是創建一個屬性特徵,將允許這句法:

has 'column_id' => (
    isa => Int 
    , is => 'ro' 
    , traits => ['DBKey'] 
    , default => 5 
    , column => 'foo' 
); 

DBKey提供的屬性特徵column,脅迫到DBCol以同樣的方式上述columns會:這將需要能夠訪問類database,schema,table,並再次爲dbh的單身人士。

+0

你能給出一個僞代碼的例子嗎? – Ether 2010-12-17 17:52:02

+0

更新了僞代碼 – 2010-12-17 18:16:36

回答

5

不會,這會很好,但強制措施確實是全球性的,沒有人寫過「上下文敏感的強制」,因爲沒有人真的確定如何去做。 (實際上,s /強制/類型約束/ - 僅僅說「這個Str必須是一個有效的列名稱,定義爲該對象的一個​​條目的HashRef」)。

人們通常會解決這個問題問題around和/或BUILDBUILDARGS的某種組合。

+0

其實,這真的很接近我想要做的事情。我只是找不到一個體面的方式來做到這一點。 – 2010-12-17 18:00:16

+2

我想通了。這就是大家一直想要做的。由於其基本假設,在當前的類型約束系統AFAIK中沒有辦法。 – hdp 2010-12-17 18:15:15

+0

更新了僞代碼 – 2010-12-17 18:17:13