Class::Data::Inheritable使うかメソッド定義するか

use Any::Moose;
extends any_moose('::Object'), 'Class::Data::Inheritable';
__PACKAGE__->mk_classdata('hoge' => 'fuga');

みたいに書いてるコードがあるんだけど、デフォルト値を動的に決めたい場合は、

sub hoge { 'fuga' }

みたいにメソッド定義してて、両者が混じってるのも今ひとつな気がしてた。サンプルが動的で無いのはご愛敬。

Class::Data::Inheritableが生成するアクセサは常にread/write共に機能する(read-onlyに出来ない)ので、クラスの定数として扱いたい場合はメソッドにする方がいいかな、と思う一方で、モジュール使ってアクセサ作るのが今時のアプローチとしては筋がいいんじゃないかという思いもありました。

MooseだとMooseX::ClassAttribute使えば、このへんも統一的に書けて気持ちよさそうだけど、今のところAny::Mooseで動作させたいので、これは使わない方向で。一応、githubにはMouseX::ClassAttributeもあるみたいだけど、状況が把握出来てないし、CPANに上がってない段階で依存するのもあまり気が進まない。どうしても必要ってわけじゃないし。

てな具合で、わりと長い間ひっかかってたんだけど、

http://trac.mizzy.org/public/wiki/MooseXClassAttribute

をみて、#moose で、C::D::Inheritable みたいなのを Moose でつかうにはどうしたらいいのん?と聞いてみたところ、mst が音速であらわれ、「C::D::Inheritable なんてつかわんとメソッド定義しろよ」といいだしたので、まあそういやそうだなーとおもった。

を見て、あーメソッドにするのって別に悪いアプローチでは無いんだと思い直した。これを絶対視するわけではないけれど、メソッドとして定義することに後ろめたさを感じる必要もないわけだ。

なんかこう「できるだけモジュールを使う方がいい」みたいな意識が強かったんだけど、必ずしもそうではなくて柔軟に考えればいいんだな。