2012-05-08 7 views
1

の日付スタンプを受け入れ、人が読める文字列(dd Mon yyyy hh:mm:ss)を返す、多くの日付時刻関連属性を持つモジュールがいくつかあります。サブクラスの複数の属性を処理するために、ベースクラスのMooseで属性修飾子を使用できますか?

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 May 2012 12:33:42 'の形式である場合、これを日付スタンプとして設定します。

だから、ModuleOneで、そこに次のようになります。事の

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

同じタイプの第二のモジュールで発生します。

has date_attr_one => (...); 

が続きます。

私が抱えている問題は、これを実行する複数のモジュールがあり、それぞれが 'around'修飾子と同じ複製コードを使用して であるということです。基本クラスを拡張しているすべてのモジュールがその修飾子を使用できるように、その修飾子をベースクラスに移動したいと思います。

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

私は実行されませんそこにいくつかのprint文を入れて(ベースクラスで):私は、正規表現などを使用して、基本クラスにそれを入れてみました。ロールはそのようなことを許さない。

モディファイアの周りをベースクラスに移動する方法はありますか?ベースクラスを拡張するすべてのモジュールは、そのモディファイアで各モデルの属性が異なる名前を使用できますか?

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

+0

してください"datestamp"を定義します。 – ikegami

+0

いつも '03 May 2012 12:33:42'として返すのであれば、なぜ"日付スタンプ "として保存したいのですか? – ikegami

+0

サードパーティのapiはそれをdatestamp(unixタイムスタンプ)として保存します。表示される内容:perl -e 'print time()' – jmcneirney

答えて

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; 
+0

これはうまくいった。どうもありがとう。 0 + $ self-> date()で '0+'を避けるためにとにかくありますか? – jmcneirney

+0

あなたはそれが何を意味するか分かりません。あなたはエポック時間を返すことを不可能にしたインタフェースを求めました。おそらくエポック時間は必要ないので、あなたはそれをまったく使用しないので取り除くものはありません。私はエポックタイムを得ることができないと思ったのはかなり制限的なので、 '$ self-> date'を数字として扱うことでそれを得ることができました。 '$ self-> date-> epoch'を使うこともできます。 – ikegami

+0

Heh。ありがとう。あなたが正しい。 :)私はテストでそれを持っていた、そして、ちょうど不自然に思えました。 – jmcneirney

関連する問題