end0tknr's kipple - web写経開発

太宰府天満宮の狛犬って、妙にカワイイ

Class::Inspectorでモジュールのメソッド(method sub function)一覧を取得

Class::Inspectorというモジュールを見かけました。
どうやら指定したモジュールのメソッド一覧を取得できるようです。

http://search.cpan.org/perldoc?Class::Inspector
http://d.hatena.ne.jp/tociyuki/20060821/1156425237

ただ、Class::InspectorのSYNOPSIS に気になる2個のメソッドがありました。

Class::Inspector->functions( 'Foo::Class' );
Class::Inspector->methods( 'Foo::Class', 'full', 'public' );

関数とメソッドの違いとは何だろう。
そこでテストスクリプトを作って、Data::Dumperに対して実験してみました。

#!perl

use Class::Inspector;
use Data::Dumper;
use Algorithm::Diff qw/diff/;

my $TARGET_CLASS = "Data::Dumper";

my $functions =	Class::Inspector->functions($TARGET_CLASS);
my $methods =	Class::Inspector->methods($TARGET_CLASS);
my @diffs = diff($functions, $methods );

for my $diff1 ( @diffs ){
    for my $diff2 ( @$diff1 ){
	print "$diff2->[0] $diff2->[1] $diff2->[2]\n";
    }
}
bash-3.2$ ./foo.pl 
+ 30 as_heavy
+ 35 export
+ 36 export_fail
+ 37 export_ok_tags
+ 38 export_tags
+ 39 export_to_level
+ 41 import
+ 45 require_version

どうやら、methods() では、Data::Dumperの親クラスであるExporterの内容も取得できるようです。
なので、次のように理解しておけばいいのかな?

関数 ( function )

関数は、そのクラスに実装されているもののみが対象。
Class::function() で呼べる。

メソッド ( method )

関数は、そのクラスに実装されているものと親クラスが対象。
$obj->method() で呼べる。