アクセサの自動生成

最初はJavaのノリでゴリゴリとアクセサを書いてたんですが、CPANのソース読んでてなるほどClass::Accessor::Fastを使えばいいのかと。

しかも、以下のように親のFooクラスでは「name」だけ、Fooを継承したFoo::Varクラスでは「name」と追加で「birthday」のアクセサが使える、という感じで便利ですね。

package Foo;
use base qw( Class::Accessor::Fast );
__PACKAGE__->mk_accessors( qw( name ) );
package Foo::Var;
use base qw/ Foo /;
__PACKAGE__->mk_accessors( qw( birthday ) );

このまま使うとgetterは「$self->get('name')」か「$self->name」、setterは「set('name', '新しい名前'」という感じになりますが、

__PACKAGE__->follow_best_practice;

とPerlベストプラクティス推奨の形に従うように指定すると、getterは「$self->get_name」、setterは「$self->set_name('新しい名前')」のように「get_」「set_」+キーの形で記述する事を強制されるようになります。

この制約は親クラスで指定するとそのサブクラスにも適用されます。

ちなみにこの制約はmk_accessorsの前に呼び出さないと効かないみたいですね。一瞬戸惑いました。

今まで私がCPANで読んだ限りでは必ずしもこの制約が使用されているわけではなくて、それは結構好みの部分もあったりするのかなぁという気が。個人的には実装者が分かってさえいれば$self->nameとやれる方が好みかなぁという感じはします。