DBICにfindByほげほげ生やしたけどCatalystでコケた

先日の「Sub::AutoでDBICにfindByほげほげを生やしてみた」が予想外に大きな反響で嬉しい反面、若干のとまどいも感じる今日この頃です。

で、そいつを喜び勇んでCatalystアプリに組み込んだら、

(in cleanup) Can't locate object method "DESTROY" via package "DBIx::Class::ResultSet" at package "DBIx::Class::ResultSet" at /home/ryo/CPAN/lib/perl5/Catalyst.pm line 1222.

とか言われてがっくり。

audosubの定義は、MyApp::Schemaに書いていくのが妥当かなと思ったけどダメ。Controllerに書いてもやっぱりダメ。MyApp::Web.pmに書くとTT関連のモジュールでいろいろコケて起動せず。

Sub::AutoがuseしてるClass::AutoloadCANのimportでエラーが出てるみたいだけど、何故Catalystに組み込むとエラーになるのかは不明。MyApp::Web.pmに書くと症状が変わるのも何が起きてるのかよく分かりません。

そもそも、DBIx::Class::ResultSetにはデストラクタが定義されてないはず。

package DBIx::Class::ResultSet;
our $AUTOLOAD;
sub AUTOLOAD {
    warn "called: $AUTOLOAD\nargs: ", (join ',', @_), "\n";
}

とか書いて適当にDBICを回すと、

called: DBIx::Class::ResultSet::DESTROY
args: DBIx::Class::ResultSet=HASH(0x14130a20)

とかコンソールに出てくる。AUTOLOADが呼ばれているので、メソッド自体は存在していないはずです。

なんの処理もしてないなら

sub DESTROY {}

とか書いとけばいんじゃね? とか思って実際にちょっと試したら動いたけど、気持ち悪いので保留。

いろいろと基礎の部分で知識が足りてないのが根本的な問題なので、勉強し直しです。Catalystの基本から掘り起こしてみよう。