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