我有几个模块,它们有许多接受日期时间相关的属性 datestamp并返回一个人类可读的字符串(dd Mon yyyy hh:mm:ss)。
package ModuleOne;
use Moose;
extends 'ModuleBase';
has date_attr_one => ( ... );
然后......
package ModuleTwo;
use Moose;
extends 'ModuleBase';
has date_attr_mouse => ( ... );
因为它正在使用我正在使用'around'属性修饰符,所以如果有的话 no参数以“2012年5月3日12:33:42”的格式返回日期。如果有的话 参数格式为'03 May 2012 12:33:42'我想将其设置为日期戳。
所以,在ModuleOne中,会有:
has date_attr_one => ( ... );
接下来是:
around 'date_attr_one' => sub { ... }
第二个模块中出现相同类型的事情。
我遇到的问题是有多个模块正在执行此操作,而且每个模块都是 使用'around'修饰符和相同的重复代码。我想将修饰符移动到基类中,以便扩展基类的每个模块都可以使用该修饰符。我尝试使用正则表达式将它放入基类中,如:(在基类中)
around qr/date_attr_one/ => sub { ... }
我在那里放了一些从未执行的打印语句。角色不允许这样的事情。
有没有办法将修饰符移动到基类中,因此扩展基类的每个模块都可以使用该修饰符,其中属性在每个模型中具有不同的名称?
因此,如上例所示,基类'around属性修饰符需要处理$ self-> date_attr_one和$ self-> date_attr_mouse等。
答案 0 :(得分:2)
如果你创建一个类似下面的包,你在课堂上只需要:
has date => (
is => 'rw',
isa => 'My::Date',
coerce => 1,
);
示例代码:
my $o = My::Class->new(date => '03 May 2012 12:33:42');
say $o->date();
say 0+$o->date();
$o->date(1336062822);
say $o->date();
say 0+$o->date();
上述模块:
package My::Date;
use strict;
use warnings;
use Moose;
use Moose::Util::TypeConstraints;
use DateTime::Format::Strptime qw( );
use POSIX qw( strftime );
my $format = DateTime::Format::Strptime->new(
pattern => '%d %b %Y %H:%M:%S',
locale => 'en_US',
time_zone => 'local',
on_error => 'croak',
);
has epoch => (
is => 'rw',
isa => 'Num',
required => 1,
);
sub as_string {
return strftime('%d %b %Y %H:%M:%S', localtime( $_[0]->epoch ));
}
coerce __PACKAGE__,
from 'Num',
via { __PACKAGE__->new( epoch => $_ ) },
from 'Str',
via { __PACKAGE__->new( epoch => $format->parse_datetime($_)->epoch ) };
use overload (
'""' => sub { $_[0]->as_string },
'0+' => sub { $_[0]->epoch },
fallback => 1,
);
1;