2007年頃からブームになり、Perlのオブジェクト定義の定番になりつつある、Mooseです。
前回のサンプルコードをMoose化しました。
(サンプルコード)
package MyApp; use strict; use warnings; sub new { my ($class, $args) = @_; my $self = bless { 'name' => $args->{name}, 'email' => $args->{email}, 'url' => $args->{url}, }, $class; return $self; } sub name { my $self = shift; my $name = shift; if ($name) { $self->{name} = $name; } return $self->{name}; } sub email { my $self = shift; my $email = shift; if ($email) { $self->{email} = $email; } return $self->{email}; } sub url { my $self = shift; my $url = shift; if ($url) { $self->{url} = $url; } return $self->{url}; } 1; __END__
これがMooseを使うと、
package MyApp; use Moose; # use strict, use warningsはいらない has 'name' => ( is => 'rw', # 読み書き可 isa => 'Str', # 型指定 ); has 'email' => ( is => 'rw', isa => 'Str', ); has 'url' => ( is => 'rw', isa => 'Str', ); __PACKAGE__->meta->make_immutable; no Moose; 1; __END__
となります。
使い方は、前回と同じコードです。
#!/us/bin/perl use strict; use warnings; use MyApp; my $object = MyApp->new({ name => 'user01', email => 'user01@example.com', url => 'http://www.example.com/', }); print "Name : ", $object->name, "\n"; print "Email : ", $object->email, "\n"; print "URL : ", $object->url, "\n"; $object->name('user02'); $object->email('user02@example.com'); print "Changed Nane : ", $object->name, "\n"; print "Changed Email : ", $object->email, "\n"; print "No Change URL : ", $object->url, "\n"; __END__
今回のサンプルコードだと、アクセサ生成くらいしかやっていないので、Class::Accessor::Fastの方がシンプルなコードになり、Mooseの凄さが分からない感じでした。
しかし、MooseにはRolesなどの強力な機能がありますので、使っていきたいと思いました。
※オブジェクト定義・アクセサ作成だけなら、Mouseの方が良いのではないでしょうか。
Moose - A postmodern object system for Perl 5 - metacpan.org
PerlでOOPの復習 〜Class::Accessor::Fast〜 - jitsu102の日記