Last Modified:
Release Slack-v0.6.0 #Perl #Slack
この文書は以前のバージョンv0.5.0とv0.6.0の変更点を記述しています。
このリリースには以前のバージョンと互換性の無い変更が含まれています。
インターフェースの追加
パターンは条件節にアップグレードされました
パターンは条件節にアップグレードされました。 これによって、Slackはより強力に柔軟にアクションのマッチ条件を記述できるようになりました。
条件節は、環境変数名と正規表現の対で定義されたハッシュリファレンスです。
条件節に指定された各条件は環境変数req->envの同名の変数とそれぞれマッチングされ、全てを満たしたアクションがマッチしたとみなされます。
これまでの文字列指定や正規表現指定は単なるシンタックスシュガーとなりました。
具体例はt/advanced-routing.tを参照してください。
事前処理を行なうためのアクションprepが追加されました
事前処理を行なうためのアクションが追加され、キーワードprepで定義できるようになりました。
prepの構文はaction,viewと全く同じですが、マッチしたアクションを全て実行します。
また探索順序はaction,viewの深さ優先探索とは逆に、ルートコントローラーからの幅優先探索になります。
Catalystのautoのイメージで間違っていません。
具体例はt/advanced-routing.tを参照してください。
アプリケーションにコントローラーを継承できるようになりました
use Slack qw(App Controller)とすることで、アプリケーションでありコントローラーでもあるクラスを作成できるようになりました。
この場合prefixは/となるため、いわゆるルートコントローラーをとても自然に記述できるようになりました。
もはやルートコントローラーのためのsub prefix { '/' }は不要です。
# --- MyApp.pm ---
package MyApp;
use Slack qw(App Controller);
# sub prefix { '/' }
# --- MyApp/Foo.pm ---
package MyApp::Foo;
use Slack qw(Controller);
# sub prefix { '/foo/' }HTTP_NOT_IMPLEMENTEDの対応が追加されました
どのアクションでも定義されていないRequestMethodに対してHTTP_NOT_IMPLEMENTEDが返されるようになりました。
マッチしたアクションだけに定義されていないRequestMethodに対しては、これまで通りHTTP_METHOD_NOT_ALLOWEDが返されます。
コンストラクタの記述に便利なユーティリティ関数が追加されました
Slack::Utilにto_refとnewが追加されました。
to_refは引数に応じて以下の結果を返します。
- 引数が無い場合は{}
- リファレンスを渡した場合はそのリファレンス$_[0]
- ハッシュに見える場合はハッシュリファレンス{@_}
- ハッシュに見えない場合は配列リファレンス[@_]
newは引数をto_refしたものをblessして返すコンストラクタです。
これは実際にSlack::Appで使われています。
インターフェースの変更
Slack::MatcherはSlack::Actionに名前が変更されました
これまではマッチングのためのオブジェクトという役割に過ぎませんでしたが、今後はアクションを表すアクションオブジェクトを意味します。
アクションオブジェクトは自身のタイプを持っています。
- type
- 
タイプ(prep,action,view)
- controller
- コントローラーオブジェクト
- name
- アクション名
- clause
- 条件節
- code
- コード節
インターフェースの削除
アプリケーションの設定appdir,rootdirが取り除かれました #8
app->config->{appdir}とapp->config->{rootdir}を自動設定する機能が削除されました。
削除された理由は3つあります。
- ビューの機能を外部に委譲するなどして、既にSlack自身は必要としていなかったため。
- ディレクトリ構成はアプリケーションごとに異なるため。 
 ディレクトリ構成をセオリー通りに固定できるのがフレームワークのメリットだと思うユーザーもいるかもしれません。 しかしセオリーが確立できていないのでその考えは正しくないと言えます。 その証拠に、他のフレームワークを見ても設定などで変更できるものがほとんどでしょう。
 結局アプリケーション側で設定することになるのであれば、フレームワーク側で設定する必要はありません。
- 設定は少ない方が良い 
 『設定より規約』でしょ?:D
なお、app->configアクセサはまだ削除はされていませんが非推奨となりました。次のリリースで削除される予定です。
アプリケーションに設定を持たせたいのであれば、ユーザーが自分でアプリケーションクラスにconfigアクセサを実装できます。
c->viewが削除されました
c->viewは不要になったため削除されました。
実装の変更
アクションの優先度が簡略化されました
優先順位は、まずアクションが属するコントローラーのprefix階層の深さによって決定されます。
prepは浅い方が、action,viewは深い方が優先されることに注意してください。
prefix階層の深さが同じ場合は、先に記述された(=先にパースされた)アクションが優先されます。 モジュールを読み込む順番によって結果が変わる可能性があるため、同じリクエストにマッチするアクションを別のパッケージに記述する場合は十分注意してください。
以前のバージョンでは、パターンの型によっても優先順位に影響がありました。 これはCatalystを参考にした結果ですが、複雑過ぎて混乱を招いていたため廃止されました。
actionは拡張子に関わらずマッチするようになりました
アクションとビューは独立しているべきであるため、actionはリクエストの拡張子を無視してマッチするようになりました。
ただし、アプリケーションで定義されていない拡張子は無視されません。
内部的には、すべての条件節で指定された拡張子をPATH_INFOから除外したものに対して、actionのマッチングを行なっています。
以前のバージョンではマッチしたビューに指定されている拡張子のみをPATH_INFOから除外してマッチングを行なっていました。
そのため、マッチするビューが無い場合は一切アクションが呼ばれませんでした。
{ extension => ... }は非推奨となりました
条件節に環境変数を指定できるようになったため、なるべく環境変数名と混同しないためにextensionは廃止されます。
代わりに{ '.' => ... }を使ってください。extensionによる指定は次のリリースで削除される予定です。
Time::Pieceに依存しなくなりました
SlackはもはやTime::Pieceを必要としません。
というより、これまでずっと不要だったのにuseしていました。
コントローラーは状態変数を持たなくなりました
コントローラーは状態変数を持たなくなりました。
これに伴いnewもされなくなりましたが、問題があった場合は将来的に変更されます。
cpanfileが追加されました #6
cpanfileが追加されました。
依存関係が多いように見えるかもしれませんが、ほとんどがperl-v5.16前後の時点でコアモジュールです。
内部的な変更
- app->action,- app->viewが削除されました。