PerlでOOPの復習 〜Moose〜

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の日記