日向夏特殊応援部隊

俺様向けメモ

探索パスにあるコンポーネントを読まないようにする

訂正 (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:ちなみに今回はそういうニーズではなく必要になった