探索パスにあるコンポーネントを読まないようにする
訂正 (2009-12-09T12:55:19+09:00)
id:charsbar さんに教えて貰ったんですが依存してる Module::Pluggable::Object の except, only とかを使えば普通に出来た罠。
__PACKAGE__->config( setup_components => ['MyApp::Web::Model::Damepo',] );
とかで同様の事が出来ます。
詳しくは Module::Pluggable の Advanced Usage に書いてあります。
以下、元のエントリ
以下は、上の奴で出来るから要らない知識です!!!
d:id:ZIGOROu:20061105:1162755013 に昔書いた通り、Catalyst の setup_components は config で探索パスを追加する事は出来ます。これは現在のバージョンでも変わってなくて、MyApp::Web だとすると、
__PACKAGE__->config( setup_components => +{ search_extra => [ '/path/to/dir' ], } );
みたいに追加すればいい。ドキュメントにも書いてある。
が、ちょっと自己都合で外したいみたいのは出来ないみたい。setup_components で対象となるモジュールのロードは load_components に依存してるみたいなので、とりあえずやっつけでこんな風にしといた。
sub locate_components { my $class = shift; my @comps = $class->next::method(shift); my $config = $class->config->{locate_components}; my %ignore_comp_map; my $ignore_comp_regex = ''; if ( ref $config ) { if ( exists $config->{ignore_components} ) { %ignore_comp_map = map { ( $_ => undef ) } @{ $config->{ignore_components} }; } if ( exists $config->{ignore_components_regex} ) { $ignore_comp_regex = $config->{ignore_components_regex}; } } $ignore_comp_regex = qr|$ignore_comp_regex| if ($ignore_comp_regex); if ($ignore_comp_regex) { @comps = grep { $_ !~ m/$ignore_comp_regex/; } grep { not exists $ignore_comp_map{$_} } @comps; } else { @comps = grep { not exists $ignore_comp_map{$_} } @comps; } return @comps; }
としておくと、
__PACKAGE__->config( load_components => +{ ignore_components => [ 'MyApp::Web::Model::Damepo', ], ignore_components_regex => [ 'Foo|Bar' ], } ); みたいな感じ。
同じソースツリーだけどデプロイ先をクラスタ化して、読み込むコンポーネントを変えてメモリ消費量がホゲホゲとか考えるなんてシーンも無きにしもあらずって気がするんだけど*1、そういう場合こういう枠組みがあると良いなと思うんですが、実は既にあったりするんですかね。
とりあえず next 嫌いです。
*1:ちなみに今回はそういうニーズではなく必要になった