北海道苫小牧市出身の初老PGが書くブログ

永遠のプログラマを夢見る、苫小牧市出身のおじさんのちらしの裏

Class::DBIでdelete後のオブジェクトを使うと?

CDBIでdelete後のオブジェクトを使うと以下のようになります。

$ perl -MFilm
my $f = Film->create_test_film();
$f->delete();
$f or die;

# 【結果】
# Operation `bool': no method found, argument in overloaded package Class::DBI::Object::Has::Been::Deleted at - line 3.

ここで言うFilmは、http://search.cpan.org/src/TMTM/Class-DBI-v3.0.16/t/testlib/Film.pmです。

解決法

  1. deleteしたオブジェクトなんか使うんじゃない
  2. CDBIなんか使うんじゃない

原因?

行き着いたのは、この問題でした。Class::DBI#delete() の中で、

bless $self, 'Class::DBI::Object::Has::Been::Deleted';

としてるのですが、こいつがoverloadプラグマを打ち消すに至ってないようです。

bless $_[0], 'Class::DBI::Object::Has::Been::Deleted';

としたら直りました*1

*1:実際には、$self = shift; とかしてるから@_絡む部分を調整しなくちゃ駄目です