現状のController拡張のベストプラクティスから次のプラクティスを考える
Controllerの拡張の現状のベストプラクティスということで、
http://search.cpan.org/src/JCAMACHO/Catalyst-Controller-FormBuilder-0.04/lib/Catalyst/Controller/FormBuilder.pm
があるよ!というのをcharsbarさんに教えてもらいました。
メソッドバッティング対策は、configでメソッド名を渡せるようにしてるみたいですね。
前のエントリーで書いたように、MooseのRoleベースでするともっと綺麗な形にできるんじゃないかなぁという気はします。ControllerにRoleをmixinする形にしたいなぁと。できることはかわらないとは思いますが、Catalyst::Controller::Hogeを多重継承することになるということの違和感から解放することはできそうです。
現状のmoose branchだとCatalyst::Controllerを継承して、そこでRoleをmixinしてやればいけそうな気もしますが、そうではなくてmixinするRoleを設定ファイルに書く程度になったらいいんじゃないかなぁという気はします。
ベースのControllerで、以下みたいな感じでかけるといいんじゃないかなぁと。基本的には使う人にはMooseが生で見えない形のほうがいいんじゃないかなぁというだけで、withでRoleをconsumeするのと変わらないわけですが。
Catalyst::Controller::Plugin::FormBuilderのパッケージにして、それをMooseのRoleにするというイメージでいます。そのRoleをpluginという形で見せてconsumeするというイメージです。
package MyApp::BaseController; BEGIN { extends 'Catalyst::Controller'; } __PACKAGE__->load_plugins(qw/FormBuilder/);
ユーザーにはプラグインという形で拡張を見せる仕組みのほうがいいんじゃないかと思うんですね。ただ、ちょっと世間一般で言うプラグインではないわけですが、適切なスコープに対する機能拡張という目的を綺麗な形で実現できるんじゃないかなぁとは思います。