@kyanny's blog

My life. Opinions are my own.

Foo パッケージの中で use した Bar パッケージの import() メソッドから Foo パッケージのシンボルテーブルをのぞくとどうなるか

sub import {
    my ($package) = (caller(1))[3] =~ /^(.*::)/;
    no strict 'refs';
    warn Dumper \%$package;

import() は BEGIN ブロックで処理され、 BEGIN ブロックを処理してるときはまだ呼び出しもとパッケージのシンボルテーブルの情報は空っぽだった。 use しただけで呼び出しもとのパッケージのすべてのサブルーチンにフックを追加するようなモジュールは、こういうやり方だと出来ないようだ。

追記

http://d.hatena.ne.jp/ktat/20081120/1227119003 で、 use Bar; をおしりに書けば良い、と教えてもらいました。なるほど。