我可以用一个属性修改器驼鹿在基类从子类处理多个属性?(Can I use an attribute

2019-09-17 03:09发布

我有几个模块有一个数字,接受一个邮戳,并返回一个人类可读的字符串(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,等等。

Answer 1:

如果您创建一个包类似下面,你在你的类需要的是:

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?
标签: perl moose