Translate

2009年5月6日水曜日

Class::Accessor::Fastモジュール

Class::Accessor::Fastは、オブジェクト指向な書き方における
bless部分やgetter/setter部分を何度も書いてげんなりするのを
代わりに受け持ってくれるモジュール。

#./lib/Hogehoge.pm
package Hogehoge;
use strict;
use warnings;

sub new{
my $class = shift;
my $ref_arg = shift;
my $self = bless {
foo => $ref_arg->{foo},
baa => $ref_arg->{baa},
}, $class;
return $self;
}

sub accessor{
my $self = shift;
my $name = shift;
if(!@_){
return $self->{$name};
}else{
$self->{$name} = shift;
}
}

sub foo{
my $self = shift;
$self->accessor("foo", @_);
}

sub baa{
my $self = shift;
$self->accessor("baa", @_);
}


#./test.pl
use strict;
use warnings;
use lib qw(./lib);
use Hogehoge;

my $obj = Hogehoge->new({foo=>"abc", baa=>456}); #オブジェクト生成と初期化
print $obj->foo, "\n"; #getter:「abc」と表示
print $obj->baa, "\n"; #getter:「456」と表示

$obj->foo(11111); #setter:「11111」とセット
print $obj->foo, "\n"; #getter:「11111」と表示


毎回、内容の、変わらないbless部分とgetter/setter部分を書くのは
めんどくさ。
そんなわけで、Class::Accessor::Fastモジュールの登場。
上記と同じことは下記でOK
#./lib/Hoge.pm
package Hoge;
use strict;
use warnings;
use base qw(Class::Accessor::Fast);
__PACKAGE__->mk_accessors( qw(baa foo) );
1;


超すっきりですね。
オブジェクトを生成したりセットしたり書き換えたりってのは何も変わらないです。
便利便利ですね。
最初の書き方だと変数が増えるたびに
sub foo{
my $self = shift;
$self->accessor("foo", @_);
}

のようにaccessorメソッドにアクセスするためのメソッドが必要でしたが
今度は、
__PACKAGE__->mk_accessors( qw(baa foo) );

mk_accessorsに増やす変数名を追加するだけですね。