2014-02-28 128 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这真的很酷,我一定会走这条路,看起来最灵活,没有我建设的东西。 –