« Ittec項目にApplicationsのエイリアスを追加して右クリックランチャー | メイン | Catalystのclassとinstance »

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してくれます。

いま、Catalystのtrunkみてたらuse YAMLは完全に消えてますね。見逃してた。
Catalyst::Plugin::ConfigLoader
は便利そうですな。

ConfigLoaderでも使っているけど、Module::Pluggable::Fastが最近熱いですね。

……と思いきや、YAML-0.54以降で*Spiffyに依存しなくなったのを受けて、
YAML対応が戻ってきてますね。
http://dev.catalyst.perl.org/changeset/3191

まぁ、::Syckとか使いたい人はConfigLoaderなり自前なりということですかね……。

たぶん、あまりTrunk追いかけないのが吉かもしれない。

コメントを投稿