Masteries

技術的なことや仕事に関することを書いていきます.

Perlで, あるクラスの親(継承元)を調べる

妙に詰まってしまったので備忘録的に書き記しておきます. さて, 次のような継承をしているPerlのクラスがあるとします:

My::Lib1 <- My::Lib2 <- My::Lib3

My::Lib3My::Lib2を, My::Lib2My::Lib1を継承している感じです. この時, 例えばMy::Lib3の親(継承元)はどこかを得るにはどうすればよいでしょうか?

解法1: ISAを見る

My::Lib3の継承元は, My::Lib3@ISAに入ります. なので, @ISAを無理やりに見るという手があります.

no strict 'refs';
my @isa = *{"My::Lib3::ISA"}{ARRAY};

@isaを見ると, このようになります(Data::Printerでダンプ):

[
    [0] [
        [0] "My::Lib2"
    ]
]

My::Lib3の継承元であるMy::Lib2が得られました.

解法2: mro::get_linear_isaを使う

id:akiym さんに教えてもらった方法ですが, mro::get_linear_isaを使う手もあります.

my @isa = mro::get_linear_isa("My::Lib3");

@isaを見ると, このようになります(Data::Printerでダンプ):

[
    [0] [
        [0] "My::Lib3",
        [1] "My::Lib2",
        [2] "My::Lib1"
    ]
]

こちらだと, My::Lib3の継承元であるMy::Lib2に加えて, その継承元であるMy::Lib1も得られるので, より便利ですね.