UNIVERSAL::isa と UNIVERSAL::can に関するメモ
UNIVERSAL::isaは、UNIVERSAL::isa()を呼んでも自分のクラス(階層)内にisa()が定義されてればそっちを呼ぶようにするためのモジュール。
以下のようにmainでUNIVERSAL::isaをuseしないと、最後の2つのUNIVERSAL::isa()は1を返します。つまり本当のUNIVERSAL::isa()が呼ばれる。
package A;
sub new { bless {}, shift }
sub isa { "hoge" }
package B;
use base qw( A );
sub new { bless {}, shift }
package main;
my $b = B->new;
warn $b->isa( "B" ); # hoge
warn $b->isa( "A" ); # hoge
warn UNIVERSAL::isa( $b, "B" ); # 1
warn UNIVERSAL::isa( $b, "A" ); # 1
これに対して、以下のようにmainでUNIVERSAL::isaをuseしてやると、最後のUNIVERSAL::isa()もhogeを返す、つまりクラスAで定義されてるisa()が呼ばれている。
package A;
sub new { bless {}, shift }
sub isa { "hoge" }
package B;
use base qw( A );
sub new { bless {}, shift }
package main;
use UNIVERSAL::isa;
my $b = B->new;
warn $b->isa( "B" ); # hoge
warn $b->isa( "A" ); # hoge
warn UNIVERSAL::isa( $b, "B" ); # hoge
warn UNIVERSAL::isa( $b, "A" ); # hoge
そしてUNIVERSAL::canも同じようなことをしてくれます。ちなみにUNIVERSAL::requireはぜんぜんこれらとは関係なく
Module->require;って呼べたり
Module->require or die "Cannot required";とかdieできたり、モジュールでrequireメソッドを使えるようにするものです。
useもできたりします。