Catalyst's ACCEPT_CONTEXT
Catalyst 5.61からmodelなどのcompornentを呼び出すところに、ACCEPT_CONTEXTなるものがある。
compornentの呼び出しはいつからか、
$c->model('MyModel')->foo; $c->view('MyView')->bar;
って方法が使えるようになってる。
現在開発中のコードでは、
my $comp = $c->components->{$try}; if ( eval { $comp->can('ACCEPT_CONTEXT'); } ) { return $comp->ACCEPT_CONTEXT($c); } else { return $comp }
というようになっていて、インスタンスでもクラスでも目的のmethodを呼び出す前にACCEPT_CONTEXTがあれば、ACCEPT_CONTEXTを引数$cで呼び出してくれる。このcontextオブジェクトをクラス側で保持しておけば、Catalyst::Compornentをベースとしていないクラスでも$cが使えるいうわけっす。
ってことで、Class::DBIのプラグインを簡単につくってみた。ただし現在のCatalystのバージョンでは動かない。
package Class::DBI::Plugin::AcceptCatalyst; use strict; use warnings; our $VERSION = '0.01'; sub import { my $caller = caller(); no strict 'refs'; $caller->mk_classdata('catalyst_context'); *{"$caller\::ACCEPT_CONTEXT"} = sub { my ($class, $c) = @_; $class->catalyst_context($c); return $class; }; }
これをロードしておけば、Class::DBIベースのクラスの中でCatalystのContextが使える、ハズ。before_hoge、after_hogeとかのTriggerでこれを利用してLogを取るなんてこともできるんじゃないかな。
ただ、このコードだとメモリリークする可能性があるので、もう一工夫いるかな。
YAML::SyckにConfigが変わるらしい5.64はいつになるだろう。
コメント
CatalystのConfig系は、紆余曲折の末に、結局ConfigLoaderプラグインになったみたいですよ。
http://search.cpan.org/dist/Catalyst-Plugin-ConfigLoader/
こちらは、YAML::SyckからYAMLにfallbackしてくれます。
投稿者: Aki | 2006年01月30日 19:55
いま、Catalystのtrunkみてたらuse YAMLは完全に消えてますね。見逃してた。
Catalyst::Plugin::ConfigLoader
は便利そうですな。
ConfigLoaderでも使っているけど、Module::Pluggable::Fastが最近熱いですね。
投稿者: かぜぶろ | 2006年01月31日 00:16
……と思いきや、YAML-0.54以降で*Spiffyに依存しなくなったのを受けて、
YAML対応が戻ってきてますね。
http://dev.catalyst.perl.org/changeset/3191
まぁ、::Syckとか使いたい人はConfigLoaderなり自前なりということですかね……。
投稿者: Aki | 2006年01月31日 02:17
たぶん、あまりTrunk追いかけないのが吉かもしれない。
投稿者: かぜぶろ | 2006年01月31日 13:11