1

日付スタンプを受け入れ、人間が読める文字列 ( 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」属性修飾子を使用しているため、パラメーターがない場合は「2012 年 5 月 3 日 12:33:42」の形式で日付が返されます。「2012 年 5 月 3 日 12:33:42」の形式のパラメーターがある場合、それを日付スタンプとして設定します。

したがって、ModuleOne では次のようになります。

has date_attr_one => ( ... );

に続く:

around 'date_attr_one' => sub { ... }

2番目のモジュールでも同じタイプのことが起こります。

私が抱えている問題は、これを行う複数のモジュールがあり、それぞれが「around」修飾子と同じ複製コードを使用していることです。基本クラスを拡張するすべてのモジュールがその修飾子を使用できるように、修飾子を基本クラスに移動したいと思います。次のような正規表現を使用して、基本クラスに入れてみました:(基本クラス内)

around qr/date_attr_one/ => sub { ... }

実行されなかったいくつかの印刷ステートメントをそこに入れました。ロールはそのようなことを許可しません。

その修飾子を基本クラスに移動して、基本クラスを拡張するすべてのモジュールが、モデルごとに属性の名前が異なるその修飾子を使用できるようにする方法はありますか?

したがって、上記の例のように、基本クラスのアラウンド属性修飾子は、$self->date_attr_one および $self->date_attr_mouse などを処理する必要があります。

4

1 に答える 1

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;
于 2012-05-09T01:33:47.097 に答える