Mobile Factory Tech Blog

技術好きな方へ!モバイルファクトリーのエンジニアたちが楽しい技術話をお届けします!

DBIのcanは、関数が生えているかでなく、実装されているかどうかを判定する

 次のコードの通り、DBIx::Sunnyを利用した際、$dbh->select_oneを呼び出せるにも関わらず、$dbh->can('select_one')falseとなります。

 canの挙動が、デフォルトと異なり、一見すると困惑します。

use Test2::V0;
use DBIx::Sunny;
use Types::Standard qw(HasMethods);

my $dsn = "dbi:SQLite:dbname=test.db";
my $dbh = DBIx::Sunny->connect($dsn, 'root', '');

ok !$dbh->can('select_one'), '不思議な挙動';
ok $dbh->select_one('SELECT 1');

ok $dbh->UNIVERSAL::can('select_one');

done_testing;

 これは、DBIがcanを上書きし、Driverで実装されているか、あるいはDBIでデフォルトで提供されているメソッドかどうか判定するためです。デフォルトの挙動で動かしたいのであれば、UNIVERSAL::canで確かめられます。

metacpan.org