基本 (コンストラクタ/継承/型)

コンストラクタ

sub BUILD {
   my ($self, $args) = @_;
}

new()は使わない。

継承

package Dog;
use Moose;
extends 'Animal';

typeによる型の作成

package Obj;
use Moose;
use Moose::Util::TypeConstraints;
use Time::Piece;
type 'Obj::Time::Piece' => where { defined $_ ? $_->isa('Time::Piece') : 1 };
has tm => (
   is  => 'rw',
   isa => 'Obj::Time::Piece',
);

package main;
use Data::Dumper;
use Time::Piece;
use DateTime;
my $tp = Time::Piece->new;
my $dt = DateTime->now;
my $t1 = Obj->new( tm => $tp );   # OK
my $t2 = Obj->new( tm => undef ); # OK
my $t3 = Obj->new( tm => $dt );   # Error!
  • Obj::Time::Piece型はTime::PieceかUndefだけ通す。

subtypeによる型のカスタマイズ(親クラスの型の継承)

package Obj; 
use Moose;
use Moose::Util::TypeConstraints; 

subtype 'Obj::Int'
   => as 'Int'
   => where { $_ >= 10 }
   => message { "$_ is under 10" };
has n => (
   is  => 'rw',
   isa => 'Obj::Int',
);

package main; 
my $o = Obj->new;
$o->n(9);
  • subtypeはtypeと違って親クラスを継承する。
  • subtypeを使うとMaybe[]が使えなくなる。

coerceによる型の強制変換

package Obj;
use Mouse;
use Mouse::Util::TypeConstraints;
coerce 'Int'
  => from 'Str'
  => via { 1 }
  => from 'Undef'
  => via { 0 };

has n => (
  is     => 'rw',
  isa    => 'Int',
  coerce => 1,
);

package main;
my $o = Obj->new;
$o->n('abc');
print $o->n,"\n";  # 1
$o->n(undef);
print $o->n,"\n";  # 0
  • hasでcoerce => 1を指定すると、hasの型はIntなので、coerce 'Int'が呼び出される。
  • fromでhas nに渡した引数の型を指定し、via でどのような型変換をするか記述する。
  • なお、hasに渡した引数の型がすでにIntならcoerceは呼び出されない。

参考

subypeとcoerceを使ってDateTimeアトリビュートを実装

package Obj;
use Mouse;
use Mouse::Util::TypeConstraints;
use DateTime::Format::Pg;
 subtype 'Obj::DateTime'
   => as 'DateTime';
 coerce 'Obj::DateTime'
   => from 'Str'
   => via { DateTime::Format::Pg->parse_date($_) };
   => from 'Undef'
   => via { DateTime->now };
 has dt => (
   is  => 'rw',
   isa => 'Obj::DateTime',
   coerce => 1,
);

package main;
my $o = Obj->new;
$o->dt('2009-02-03');
print $o->dt->ymd,"\n";

aroundによるゲッターの拡張

package Obj;
use Moose;
has n => (
   is => 'rw',
   isa => 'Int',
);
around 'n' => sub {
   my $next = shift;
   my $self = shift;
   return $self->$next . '!' unless @_;

   my $arg = shift;
   return $self->$next($arg);
};

package main;
my $o = Obj->new;
$o->n(10);
print $o->n, "\n"; # 10!とビックリがつく

http://search.cpan.org/perldoc?Moose::Manual::FAQ#How_can_I_inflate/deflate_values_in_accessors?

メソッド・アトリビュート一覧を取得する

package Obj;
use Moose;
has n => (
   is => 'rw',
);

package main;
use Data::Dumper;
my $o = Obj->new;
print Dumper $o->get_attribute_list;
print Dumper $o->get_method_list;

参考


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS

Last-modified: 2011-06-11 (土) 18:40:27 (2570d)