我有几个模块有一个数字,接受一个邮戳,并返回一个人类可读的字符串(DD周一YYYY HH:MM:SS)日期时间相关的属性。
package ModuleOne;
use Moose;
extends 'ModuleBase';
has date_attr_one => ( ... );
接着 ...
package ModuleTwo;
use Moose;
extends 'ModuleBase';
has date_attr_mouse => ( ... );
因为它是目前正在我使用的是“左右”属性修改器,这样,如果没有参数的'03 2012年5月12' 时33分42秒的格式返回的日期。 如果在03年的2012年5月十二时33分42' 秒格式的参数我想设置,作为一个邮戳。
所以,在ModuleOne的,将有:
has date_attr_one => ( ... );
其次是:
around 'date_attr_one' => sub { ... }
同一类型的事情第二模块中发生。
我遇到的问题是,有多个模块,这样做的,他们每个人使用“围绕”改性剂和相同的重复代码。 我想,围绕修改进入的基类所以每一个扩展的基类可以使用该调节器模块。 我试图把它变成基类使用一个正则表达式,如:(在基类)
around qr/date_attr_one/ => sub { ... }
我摆在那里的一些打印语句永远不会执行。 角色不允许这样的事情。
有没有办法,围绕修改进入的基类所以每一个扩展的基类可以使用调节剂,其中的属性将在每个模型名称不同模块的方法吗?
所以,在上面的例子中,基类的周围属性修改器将需要处理自$> date_attr_one和$自我> date_attr_mouse,等等。
如果您创建一个包类似下面,你在你的类需要的是:
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;
文章来源: Can I use an attribute modifer in Moose in a base class to handle multiple attributes from sub classes?