2014-02-28 168 views
5

使用Moose時,某些屬性的自定義初始化的典型方法是什麼?Moose屬性初始化

舉例來說,假設我參加字符串格式兩個日期輸入到我的課:

has startdate => (is => 'ro', isa => 'Str', required => 1); 
has enddate => (is => 'ro', isa => 'Str'); 

這些日期都在爲字符串,但我需要他們在一個特定的日期格式(ISO8601)格式,而不麋,我只是在new()初始化它們,但我不確定與穆斯。

看起來,閱讀文檔的可行選項在BUILDARGS,BUILD或使用強制。考慮到我有一個功能_format_as_iso8601()可以取得一個日期並返回格式正確,這些將是最合適的?

回答

5

BUILD在構造函數之後調用,這使得它可以方便地驗證狀態,但不一定有用於格式化傳入參數。

BUILDARGS會允許您在調用構造函數之前修改傳入參數,這使得它更適合這種情況。你的屬性是隻讀的,所以這可以工作。

但是...如果你渴望靜態打字,爲什麼你會在承諾「這是一個字符串」之後停下來?如果爲ISO8601字符串創建subtype,則可以承諾「這是一個字符串它具有X格式」。更好的是,你正以這種方式立即輕鬆地將其移植到其他屬性上。

我相當懷疑正則表達式下面會爲你工作,但我希望它會得到跨越點:

#define the type 
subtype 'iso8601', 
    as 'Str', 
    where { /\d{4}-\d{2}-\d{2}/ }, 
    message { "Not a valid ISO8601 string ($_)" }; 

#provide a coercion 
coerce 'iso8601', 
    from 'Str', 
    via { _format_as_iso8601 $_ }; 

#tell moose to coerce the value 
has startdate => (is => 'ro', isa => 'iso8601', required => 1, coerce => 1); 
+0

謝謝,這只是我希望存在的解決方案類型。 –

+3

我的類型:: XSD具有內置的Date類型約束。這是[從字符串強制的示例](https://gist.github.com/tobyink/9280334)。該類型是可參數化的,允許您使用類型約束,如Date [minInclusive =>'1970-01-01']'。 – tobyink

+0

@tobyink這真的很酷,我一定會走這條路,看起來最靈活,沒有我建設的東西。 –