あなたがしていることをしたいと思う理由は 2 つありますが、どちらも悪いことです。
まず、親クラスからメソッドをインポートしようとしています...何らかの理由で。オブジェクト指向の仕組みを誤解しているかもしれません。その必要はありません。継承されたメソッドをメソッドとして呼び出すだけで、それらのメソッドが奇妙なことをしていない限り、問題なく動作します。
これは、一部がメソッドで一部がインポートされた関数である混合使用モジュールである可能性が高くなります。そしてそのためにあなたができること...
use base 'Foo::Base';
use Foo::Base;
そして、あなたはそれがちょっと奇妙に見えることを正しく観察しました... それはちょっと奇妙だからです. エクスポートも行うクラスにはイディオムが混在しているため、奇妙な使用パターンが発生します。
最善の方法は、関数をエクスポートする代わりに、クラスを再設計して、関数を独自のモジュールに分割するか、クラス メソッドにすることです。関数がクラスとあまり関係がない場合は、スピンオフするのが最善です。それらがクラスに関連している場合は、それらをクラス メソッドにします。
use base 'Foo::Base';
Foo::Base->some_function_that_used_to_be_exported;
これにより、インターフェイスの不一致が解消され、おまけとして、サブクラスは他のメソッドと同様にクラス メソッドの動作をオーバーライドできます。
package Bar;
use base 'Foo::Base';
# override
sub some_function_that_used_to_be_exported {
my($class, @args) = @_;
...do something extra maybe...
$class->SUPER::some_function_that_used_to_be_exported(@args);
...and maybe something else...
}
基本クラスを制御できない場合でも、エクスポートされた関数をメソッドに変換するサブクラスを作成することで、インターフェイスを正常にすることができます。
package SaneFoo;
use base 'Foo::Base';
# For each function exported by Foo::Base, create a wrapper class
# method which throws away the first argument (the class name) and
# calls the function.
for my $name (@Foo::Base::EXPORT, @Foo::Base::EXPORT_OK) {
my $function = Foo::Base->can($name);
*{$name} = sub {
my $class = shift;
return $function->(@_);
};
}