あなたがやっていることをしたいかもしれない2つの理由があります。どちらも悪いです。
まず、何らかの理由で親クラスからメソッドをインポートしようとしていますか?多分OOの仕組みを誤解しているかもしれません。あなたはそれをする必要はありません。継承されたメソッドをメソッドとして呼び出すだけで、それらのメソッドが何か変なことをしていなければ正常に動作します。
これは、いくつかがメソッドであり、そのうちのいくつかがインポート関数である混合使用モジュールである可能性があります。そしてそのためにあなたはすることができます...
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...
}
あなたは、基本クラスのコントロールを持っていない場合、あなたはまだ方法にエクスポート機能をオンサブクラスを書くことでSANEインターフェースを作ることができます。
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->(@_);
};
}
はい、これはMojo :: BaseまたはClass :: Simpleと非常によく似ています。しかし、私はより良いコードアーキテクチャをあきらめることにしました=) – shootnix