ziguzagu.org

Exporter を継承しつつ import を override するとき

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 になってしまったというところでした。