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もできたりします。