2016-09-16 118 views
2

我們使用Perl Moo。如何更改屬性類型? (Perl Moo)

讓有定義一組屬性:

package C; 
use Moo; 
use Types::Standard qw(Str Int Num Maybe); 

has 'x' => (is=>'rw', isa=>Str); 
has 'y' => (is=>'rw', isa=>Int); 
has 'z' => (is=>'rw', isa=>Int); 

# here to insert make_optional() described below 

1; 

我想編寫一個程序,這將有可能[T]替換T代表的某些屬性。例如:make_optional(qw(x y))應使xMaybe[Str]的類型和yMaybe[Int]的類型。

如何用Moo做到這一點?

+2

就像你有很多問題一樣,我在問自己:**爲什麼**? – simbabque

+0

@simbabque我們有一些(輕量級但功能不豐富的)ORM(高於DBI + SQL的級別)。現在我受命制定「業務對象」(高於ORM級別)。業務對象的某些類型(和「has」語句)是從DB列信息自動生成的。但我需要手動指定可以使用'undef'值(不同於NULL列)('Maybe'類型)的列列表,並以簡單的方式執行。 – porton

+0

不管你使用DBIC時表格佈局如何變化,你不能編寫代碼生成器並運行它嗎? – simbabque

回答

4

你不能。

Moo does not have a Meta Object Protocol。沒有它,你不能回去改變東西。

沒有元對象。如果您需要這種複雜程度,您需要Moose - Moo很小,因爲它明確不提供元協議。

此外,類型只是代碼參考。

沒有內置式系統。 isa用coderef驗證;如果您需要複雜的類型,Type :: Tiny可以提供類型,類型庫,並且可以與Moo和Moose無縫協作。


你可以做的是什麼,也許寫訪問某種單別的地方來決定,如果它像Maybe[Str]Str一個類型,但是這是一個長鏡頭,可能醜陋,瘋狂的,你不該」不要這樣做。

+0

但似乎我可以得到一個coderef'c'並用'Maybe [c]'代替它。問題是在哪裏獲取給定屬性的類型coderef。 – porton

+1

@porton可能是一個新問題。或者去#moose問。他們會試圖說服你,但他們會提供幫助。 – simbabque