如何在Perl中找到从包中继承的所有包?

Mar*_*ark 4 perl inheritance moose package

我有许多不同的网站,我从中下载数据并按摩到其他格式(使用Perl)在工作中使用,这些都是从一个Perl脚本运行的,如下所示:

#! /usr/bin/perl
use strict;

use My::Package1;
use My::Package2;

my $p1 = My::Package1->new;
$p1->download;

my $p2 = My::Package2->new;
$p2->download;
Run Code Online (Sandbox Code Playgroud)

等等等等.目前每个My::Package都是自己的包装; 它不会从基础包或任何东西继承.我打算重新编写它们Moose,我希望每次添加新软件包时都不必编辑运行下载的Perl脚本,可能有办法找到从基础软件包继承的软件包,并且然后在循环中实例化每个并进行下载,有点像:

#! /usr/bin/perl
use strict;

for my $pname (packages_that_inherit_from("My::Package")) {
    my $package = $pname->new;
    $package->download;
}
Run Code Online (Sandbox Code Playgroud)

它可能是什么,或者是什么?

TIA

dra*_*tun 6

使用MooseClass::MOP基础,你可以找到分配给每个类的子类(在那个时间点).

来自Class::MOP::Classdocs:

$ metaclass-> subclasses 这将返回此类的所有子类的列表,甚至是间接子类.

$ metaclass-> direct_subclasses 这将返回此类的直接子类列表,该列不包含间接子类.

例如,如果我们构建这些类:

{
    package Root;
    use Moose;
    use namespace::clean -except => 'meta';

    sub baz      { say 'Some root thingy' }
    sub download { say "downloading from " . __PACKAGE__ }
}

{
    package NodeA;
    use Moose;
    extends 'Root';
    use namespace::clean -except => 'meta';
    sub download { say "downloading from " . __PACKAGE__ }
}

{
    package NodeA1;
    use Moose;
    extends 'NodeA';
    use namespace::clean -except => 'meta';
    sub download { say "downloading from " . __PACKAGE__ }
}
Run Code Online (Sandbox Code Playgroud)

然后以您的示例为基础,我们可以这样做:

for my $pname ( Root->new->meta->direct_subclasses ) {
    my $package = $pname->new;
    $package->download;
}

# =>  "downloading from NodeA"
Run Code Online (Sandbox Code Playgroud)

以上运行NodeA->download.改变以上也meta->subclasses将运行NodeA1->download.

/ I3az /