end0tknr's kipple - 新web写経開発

http://d.hatena.ne.jp/end0tknr/ から移転しました

Class::Accessor::Fast と Class::Data::Inheritable

Class::Accessor::Fast はインスタンス変数、Class::Data::Inheritable はクラス変数を保持します。
サンプルスクリプトを実行すれば、一目瞭然。

package ValTest1;

use base qw/Class::Accessor::Fast Class::Data::Inheritable/;
__PACKAGE__->mk_accessors('data');


package ValTest2;

use base qw/Class::Accessor::Fast Class::Data::Inheritable/;
__PACKAGE__->mk_classdata('data');


package TestMain;

my $test11 = ValTest1->new();
my $test12 = ValTest1->new();

$test11->data('data_11');
$test12->data('data_12');
print "TEST11=", $test11->data , " TEST12=", $test12->data , "\n";


my $test21 = ValTest2->new();
my $test22 = ValTest2->new();

$test21->data('data_11');
$test22->data('data_12');
print "TEST21=", $test21->data, " TEST22=", $test22->data, "\n";

ValTest2->data('data_00');
print "TEST21=", $test21->data, " TEST22=", $test22->data, "\n";

これと実行すると、次のようになり、mk_classdata() では dataが上書きされることが分かります。

$ perl foo.pl 
TEST11=data_11 TEST12=data_12
TEST21=data_12 TEST22=data_12
TEST21=data_00 TEST22=data_00
$ 

C::A::Fast の make_ro_accessor, make_wo_accessor

先程のClass::Accessor::Fastのサンプルスクリプトでは、mk_accessors() を使用しましたが、srcを読むと getterのみを提供するmake_ro_accessor() や、 setterのみを提供するmake_wo_accessor() もあるようです。