Class::Inspector

Catalyst 5.7001 を見ていたら Class::Inspector が使われていました。Catalyst の 5.70_01 から使われるようになったようです。
パッケージ・ファイルを求めたり、パッケージで定義されたサブルーチン名やそのコード・リファレンスを求めることができるようです。さらに、@パッケージ::ISA で継承したメソッドを含め、メソッド名・定義クラス・コードリファレンスを求めることもできるようです。サブクラスの一覧を探す機能もありますね。
http://search.cpan.org/~adamk/Class-Inspector-1.16/
POD の説明を読むと、クラスメソッドでパッケージの情報を取得できるようになっています。UNIVERSAL::can や @INC、%INC 辿りや、シンボルテーブル参照をスマートにカプセル化してあり便利そうです。以下、POD の概略。

Class::Inspector->installed('Package::Name')
@INC を辿って、パッケージがインストール済みかどうかをチェックします。リターン値は真偽。
Class::Inspector->loaded('Package::Name')
パッケージがロード済みかどうかをチェックします。リターン値は真偽。
Class::Inspector->filename('Package::Name')
パッケージ名から Package/Name.pm などへのファイル名に変換します。
Class::Inspector->resolved_filename('Package::Name')
@INC を辿って、Package/Name.pm ファイルのフルパスネームを求めます。
Class::Inspector->loaded_filename('Package::Name')
%INC からロードしたファイル名を求めます。
Class::Inspector->functions('Package::Name')
シンボル・テーブルより、そのパッケージで宣言されているすべてのサブルーチン名のリストを配列リファレンスを求めます。メソッドかどうかはおかまいなしでサブルーチンをすべて拾います。また、継承している親クラスは辿りません。
Class::Inspector->function_refs('Package::Name')
シンボル・テーブルより、そのパッケージで宣言されているすべてのサブルーチンのコード・リファレンスを並べた配列リファレンスを求めます。以下、同上。
Class::Inspector->function_exists('Package::Name', 'function')
ある名前のサブルーチンが、そのパッケージで宣言されているかどうかを求めます。以下、同上。
Class::Inspector->methods('Package::Name', 'private')
継承ツリーを辿り、プライベート・メソッド名のリストを配列リファレンスで求めます。サブルーチン名がアンダースコアで始まるものをプライベート・メソッドとみなします。
Class::Inspector->methods('Package::Name', 'public')
継承ツリーを辿り、パブリック・メソッド名のリストを配列リファレンスで求めます。サブルーチン名がアンダースコアで始まらないものをパブリック・メソッドとみなします。
Class::Inspector->methods('Package::Name', 上記, 'full')
メソッド名の前に定義されているクラス名をくっつけます。
Class::Inspector->methods('Package::Name', 上記, 'expanded')
メソッド名ではなく、[フル名, クラス名、メソッド名、コード・リファレンス] を並べたリストを配列リファレンスで求めます。
Class::Inspector->subclasses('Package::Name')
あるクラスのサブクラスの名前をすべて求めます。
残念ながら、パッケージのソース中の mk_accessor 系や、mk_classdata を追跡する機能を期待したのですが、入っていませんでした。これは予想通りでしたが、AUTOLOAD は無視するようです。