Class::Data::Accessor と遊んでみる

fbis さんの アクセサにはClass::Data::Accessor - Unknown::Programming という記事を読んで,ちょっと興味がでたので触ってみました。

#!/usr/bin/perl

package Hoge;
use base qw(Class::Data::Accessor);
__PACKAGE__->mk_classaccessor('msg');
__PACKAGE__->msg('Hello, world!');

sub new {
  my $class = shift;
  return bless {}, ref $class || $class;
}


package main;

my $a = Hoge->new;
print "a: " . $a->msg . "\n";
$a->msg('wktk');
print "a: " . $a->msg . "\n";

print "\ncreate new instance\n";
my $b = Hoge->new;
print "b: " . $b->msg . "\n";

print "\nsetting class prop to 'kwsk'\n";
Hoge->msg('kwsk');
my $c = Hoge->new;
print "a: " . $a->msg . "\n";
print "b: " . $b->msg . "\n";
print "c: " . $c->msg . "\n";

とちゅうでクラス変数としていじったりした場合にどうなるのか,と思い,やってみたのですが,この結果は,

a: Hello, world!
a: wktk

create new instance
b: Hello, world!

setting class prop to 'kwsk'
a: wktk
b: kwsk
c: kwsk

クラス変数をいじると,それまで生成したインスタンスのプロパティがデフォルト値の場合,変更されます。というか,インスタンスのプロパティに値をセットした場合に初めて,インスタンス所属の変数になるというか,copy on write 的というか。

最近流行の言語仕様(って具体的には忘れたんですが)的な気もしますが,頭がこんがらかりそうですね。しかもあとからいじれる(かつ,既存のインスタンスに影響をおよぼす)ことを鑑みると mod_perl と一緒に使うことに躊躇します。