Exporter を継承しているクラスで import を override するには、親(Exporter) の import を呼んであげないといけないんだけど、その呼び出し方がひと味違うらしい。
package Foo;
use strict;
use warnings;
use base qw( Exporter );
our @EXPORT = qw( foo );
sub foo {
print 'foo';
}
sub import {
strict->import;
warnings->import;
__PACKAGE__->export_to_level(1, @_);
}
export_to_level を呼び出してやる。引数の意味は以下のとおり。
export_to_level($where_to_export, $package, @what_to_export)
ようは caller 呼び出すんですな。でも、そもそもこんなケースは特殊のような気がするので、
export_to_level(1, @_)
という決まり文句でぼんやり覚えておくことにする。
そもそもこれにたどり着いたきっかけは、テストコード用のユーティリティ集めた Utility パッケージ書いてて、テストコード本体のほうにもろもろ use を毎回閣の面倒だから sub import で import したれ、とおもって書いたところ、@EXPORT で export してた関数が Undefined subroutine になってしまったというところでした。