Catalyst, Sledge, Maypole

どれもPerlフレームワークです。
Maypoleのソースを読んで、少し模写して、なんとなく流れがわかってきたところで、他のフレームワークがどうなってるのか気になってきました。で、すぐに思いつくところとしてCatalystSledgeのソースを読んでみました。といっても、(これにはすごく驚いたのだけれど)Catalystは巨大すぎてとてもソースを読んでいられなかったので、ほぼすべてマニュアルから知識を仕入れました。どれもちゃんと使ったことはないので、とんちんかんな理解かもしれないけれど、とりあえずメモっておこう。

Maypole

3つの中では一番お固いフレームワーク。固いってのは、フレームワーク側が処理フローの多くを決めてしまうのでアプリケーション側でやること(できること)が少ないってことです。そのぶん、うまくいけば簡単にアプリケーションを作れます(たぶん)。MaypoleのキホンはURLのPATH INFO(っていうのかな)

http://localhost/xxx.cgi/entry/list/

みたいなURLの場合、/entry/list/がモデルとアクションにディスパッチされるってこと。この場合はentryってモデルに対してlistってアクションをする。アクションが決まればビューも決まる。で、Maypoleはコントローラがすげーいろんなことをやって、モデルにディスパッチしたあとビューにディスパッチしてレスポンスを出力して終わり、というフローなのだけれど、モデルもまたベースクラスが基本的なCRUD(create, read, update, delete)を実装しているので、アプリケーション側では何も書かなくてもなんか動作するものができてしまいます。もちろん、もっといろいろやりたい場合はそれをオーバーライドしたり、新たなアクションを実装したりすればいい。アクションはモデルクラスに書いて、属性を付けて外部から起動できるアクションに指定します。

sub do_edit : Exported {}

キホンはこんなところかな。
全体の流れはこのような感じになっているみたいです。この流れはコントローラ役を果たすMaypoleというモジュールが中心となって作り出されます。

  1. Maypole::Applicationをuseするクラス(ユーザーが作成)がCGI or Apacheハンドラから起動される
  2. Maypole::Applicationのimportでフロントエンド(CGI::Maypole or Apache::MVC)を決定
  3. setupにてモデルクラスのロード、データベース接続。モデルクラスの作成はClass::DBI::Loaderで
  4. handlerにてビューの初期化。
  5. blessしてリクエストと名乗るようになる
  6. リクエストの取得
  7. パス、パラメータ解析
  8. さらに別handlerへ。ここがコア。
  9. 使用するモデルクラスの決定(パス解析の結果に従う)
  10. モデルの使用が許可されているか検証
  11. 認証処理
  12. モデルの実行(アクション)。データの取り出しとか、保存とか。
  13. ビューの実行。パラメータを作ってテンプレートに渡す。Template Toolkit
  14. もとのhandlerに戻ってレスポンスのアウトプットして終わり

Catalyst

ソースは眺めただけ。
Catalyst::Manual::Internals - Catalyst Internals - metacpan.org
より。

  1. アプリケーションモジュールがCatalystをロード。オプションの評価、モジュールのロード、エンジンの決定
  2. actionする(よくわかんないけど)。Module::Pluggable::FastというすごそうなモジュールがModelとかViewとかのモジュールをロード
  3. ここまでが初期化フェーズ。次からリクエストハンドリングとか。
  4. context objectというのを作る。prepare_xxxというのをひたすらなんかする。
  5. process(ディスパッチ)
  6. finalize(レスポンス)

おあー、ぜんぜんだめだ。わかってないな。あとは勝手な印象。

  • とにかく巨大
  • モジュール数が半端じゃない
  • $c->forwardの力でコントローラ内を動き回れる
  • 自由自在な感じ
  • なにをどーすればいいかわからん
  • ヘルパースクリプトとビルトインサーバーはカッコいいけど今は関係ない
  • でもやっぱカッコいい

Sledge

ライブドアがオンザエッジだったころに開発されたフレームワーク。初の日本製Perlフレームワーク
まず目立つのがFactory Methodでオブジェクトの生成をやってるところ。オブジェクトってのはリクエストだったりセッションだったり認証だったり、まあそんな諸々の。で、骨子はPagesというモジュール。Pages::Baseとか。これが流れを作り出す。つまりコントローラだ。流れを作って実際の処理はそれぞれのモジュールでやるって感じ。要所要所にトリガーがあって独自処理ができるっぽい。初期化後とかディスパッチ前とかに。

  1. Sledge::Pages::Baseを継承してモジュールを作る
  2. newするとリクエストオブジェクトとか、いくつかのオブジェクトが初期化される
  3. dispatchするpageを指定してdispatch(page)とかするっぽい。するとあとで、dispatch_pageっていうメソッドがコールされるのでここでなんかすればいい
  4. あとの処理はレスポンスの出力まですべてdispatchの中でやるっぽいのでソースよめ
    • -

ええと、Maypoleにだけ力いれているように見えますが別にひいきとかじゃなくて、これはソースをじっくり読んだので一番わかってるってだけ。あとの二つは30分くらいずつしか眺めてないので。で、全体的な印象としてはCatalystはちょっと異質だということだ。はっきりいってよくわからん。すごそうってことしかわからない。でも一番カッコいい。Sledgeは一番実用的な感じ。仕事使うのにどれか選びなさいといわれたらこれを選ぶ気がする。で、Maypoleは管理画面の自動生成用に。と思ってソースを読んでいました。たぶんそーいう単純でめんどくさいけどいつでもやらなきゃいけなくてどうしよう的なものを解決してくれそうな雰囲気を以前から感じていたので。いいところを盗んで自社のライブラリ用になんか作りたいなーという夢。
あと、
http://dev.catalyst.perl.org/wiki/Movies
で見れるCatalystのデモムービーでScaffoldingってところのやつなんだけど、これだけでMaypoleに勝ち目はないのではないかとも思ってしまったりしたのだけれど。まだよくわかってないけど。

    • -

Catalyst | Perl MVC web application framework
GitHub - livedoor/Sledge: ancient Perl Web Application Framework.
http://maypole.perl.org/