Controllerでの拡張 -> Roleでの拡張

hide-Kさんからコメントをもらったので少し。

hide-Kさんの言われてるのは、Action+Contrllerのベースクラスという話だと理解してます。ActionClassの指定を簡単にするために、Controllerのベースクラスを使うと。

Actionを使う事についてはそれがいいと思っていて、例えばHTML::FormFu だと、Catalyst::Controller::HTML::FormFu::Action::Formを使うのは、それがCatalyst流でそれはいいんじゃないかと思っています。そこではなくて、Catalyst::Controller::HTML::FormFuという形でControllerにして使うのを何とかできないかなぁと思っています。

BaseのController(Catalyst::Controller::HTML::FormFu) にすることの意味は、

  • Componentに便利メソッドの追加(例えば、stashの隠蔽など) 
  • AttributeでAction Classを簡単に指定する

ということを基本的にするためにしているものなんじゃないかと思っています。

ここで違和感があるのは、

  • Validator用のControllerを継承しなければならない
    • Validator is a controllerに見えると書いているのはこの点です
  • 使うまでのステップが長い事
    • Controller継承、Attribute追加、Controllerでのメソッド呼び出し
  • Controllerのメソッドのバッティングは防げない

という点です

これらの問題は、Moose版Cat+MooseのRoleで、もっと綺麗にできる可能性がありそうだなぁと思っていて、

  • Controller用のPluginロード(MooseのRoleをconsume)
  • 呼び出しまでのステップ
    • Pluginロード、Controllerでのメソッド呼び出し

程度でできるんじゃないかと思っています

例えば、Catalyst::Plugin::FormValidator::Simple::Autoだと、

  • Pluginをロードして
  • $c->form->has_error

で使えるというのは、とてもわかりやすくて、それと同じ程度の感じにできないかなぁと思ってます。

実現するうえでの課題は、Attributeを代替するための方法かなぁと思ってます。

MooseのRoleでPluginっぽく見せる形の方が綺麗に問題を解決できて、ユーザーからはPluginをロードすれば便利メソッドがControllerに生えて便利という形になるんじゃないかなと思ってます。仮にバッティングしても別名にして変更できるようにしておくことができるようになると。

多分、hide-Kさん, charsbarさんが書かれているのは、
ExtendingCatalystに書いてあるように、現行バージョンだとActionClass + Base Contrllerで実現できるよ!ってことなんじゃないかと理解しています。

自分が書いているのは、現行バージョンでControllerとして拡張している部分を、Roleで代替したいなぁということを書いています。ただ、Roleとして見せるのではなく、Pluginという形で見せたいと思っています。