Test::Deep0.103以降を入れてると、Test::Declareを使ったmake testが通らない

僕の手元でTest::DeclareとかDBIx::Skinnyをmake testすると、

Subroutine Test::Declare::isa redefined at /opt/local/lib/perl5/5.8.9/Exporter.pm line 67.
 at /Users/ryo/perl5/lib/perl5/Test/Deep.pm line 30

とか怒られます。proveで直接テスト走らせたら問題無いので、そのままmake installしてました。

てなことを両モジュールの作者であるid:nekokakさんに聞いてみたら、向こうでは問題なく動いてるということだったのでちょっと調べてみました。

エラーメッセージからisaのEXPORTで問題が発生してるのは分かるとして、これが出る環境とそうでない環境の違いはどこなんだろう。

と思ったら、Test::Deepは0.102以前のバージョンではisaをEXPORTしていないことが判明。0.103で

# this is ugly, I should never have exported a sub called isa now I
# have to try figure out if the recipient wanted my isa or if a class
# imported us and UNIVERSAL::isa is being called on that class.
# Luckily our isa always expects 1 argument and U::isa always expects
# 2, so we can figure out (assuming the caller is no buggy).
sub isa
{
	if (@_ == 1)
	{
		goto &Isa;
	}
	else
	{
		goto &UNIVERSAL::isa;
	}
}

push(@EXPORT, "isa");

というコードが入って、それが衝突の原因になっていた模様。

コメントを見ると、このアプローチやりたくなさそうなので、将来的にはisaをEXPORTしなくなるのかな。でも、0.103のリリースが2008/06/02で、最新版の0.106でもそのままってことは見込み薄いかも…

make testでTest::Deepが呼ばれる理由とか仕組みとか、そういうところが分かってれば対応出来るのかなー。今のところ手動インストールです。