Catalystのstashをグローバル変数的に使うのは

基本的に古い時代の名残なんじゃあるまいか。

stash は local なグローバル変数として利用されているとおもうのですが、あれはあんまりよくないんじゃないかなーと感じている。

stash じゃなくて各オブジェクトに明示的に渡した方が幸せだとおもう。

たとえば、Catalyst本で使いまくっていたら先日「使うな危険」とラベリングされてjrockway涙目のC::C::BindLex。これはstashの中身はすべて(場合によっては複数のものを連続して/切り替えて使う)ビューの出力に使うデータである、という前提があるから成り立っている。

ビューのテンプレート設定とかもそう。古くさいC::V::TTではstash経由でテンプレを渡しているけど、新しいC::V::Templatedベースのものはstashなんぞ通さず、$c->view(...)->template('template')のような形で直接指定できるようになっている。

セッションとか認証まわりのデータも、本来出力用のデータではないから、stashには保存されない。

もちろんなかにはstashを自前のデータ置き場にしてしまっているプラグインコンポーネントもあるけど、基本的にそういうのはベタープラクティスが定まる前の古いもの(か、そういうstash内の衝突とかを気にしていないもの)だから、よほどの理由でもなければいまさら使うには値しない。

――というくらいのしばりをかけて使う(「TT->processの2番目の引数」以外の使い方を許容しない)分には、stashはあまり問題にはならないんでないかしら。

もちろんプラグインが意味もなくstashに自分のデータを保存するのはよろしくないと思うけど、プラグインの場合はそれ以前の問題だしね。