読者です 読者をやめる 読者になる 読者になる

Data::Visitor の変更で Data::Visitor::Encode がこけた

perl

つい先日、2008-07-21 にリリースされた Data::Visitor 0.18 をインストールしたら Data::Visitor::Encode がコンパイルエラー。

Can't locate object method "mk_accessors" via package "Data::Visitor::Encode" 

Data::Visitor の Changes には

0.18
	- Weak reference support

とさらっと書いてあるんだけど、実は内部的には親クラスが替わっていて……

$ diff -u Visitor.pm.0.17 Visitor.pm.0.18
--- Visitor.pm.0.17	2008-07-20 06:35:58.000000000 +0900
+++ Visitor.pm.0.18	2008-07-22 06:36:29.000000000 +0900
@@ -1,22 +1,33 @@
 #!/usr/bin/perl
 
 package Data::Visitor;
-use base qw/Class::Accessor/;
+use Squirrel;

Class::Accessor base から Mouse(Squirrel) Base になったため、Class::Accessor にあるはずの mk_accessors がなくなったので、D::V::Encode がこけたと。

--- lib/Data/Visitor/Encode.pm.orig	2007-11-11 03:40:45.000000000 +0900
+++ lib/Data/Visitor/Encode.pm	2008-07-24 03:46:54.000000000 +0900
@@ -13,7 +13,14 @@
 BEGIN
 {
     our $VERSION = '0.09000';
-    __PACKAGE__->mk_accessors('visit_method', 'extra_args');
+    if ( Data::Visitor->VERSION >= 0.18 ) {
+        use Squirrel;
+        has 'visit_method' => ( is => 'rw' );
+        has 'extra_args'   => ( is => 'rw' );
+    }
+    else {
+        __PACKAGE__->mk_accessors('visit_method', 'extra_args');
+    }
 }

こんな風に Data::Visitor のバージョンで分岐するか、いっそ use Data::Visitor 0.18 しちゃってもいいのかも。
RTに登録すべきかな。

[追記]
Mouse base になった Data::Visitor::Encode-0.10001 がリリースされました。