我正在努力避免Module::Pluggable
并让事情变得更容易。
这是我的工作,我有一组存储在modules/
中的模块,里面定义的所有包都共享相同的方法名称:
# in XX.pm
package MyClass::XX;
sub new {}
sub method_1 {}
sub method_2 {}
# in YY.pm
package MyClass::YY;
sub new {}
sub method_1 {}
sub method_2 {}
(但请注意,单个.pm文件中可能定义了多个模块)
现在我想让所有对象都受到祝福,例如[ XX->new, YY->new]
这可能吗?
答案 0 :(得分:2)
您应该能够遍历您所说的modules/
目录,并收集其中的文件列表。 (使用opendir
或更好,Path::Tiny收集文件列表。)然后:
my @classes = map {
(my $class = $_) =~ s{/}{::}g;
$class =~ s{\.pm\z}{};
$class;
} @files;
在上面我假设一个相当标准的文件名到类名映射。如果它不适合你的情况,请随意调整它。
一旦有了类列表,就可以很容易地找回对象列表:
my @objects = map $_->new, @classes;
我个人虽然使用Module::Pluggable。不要害怕弃用警告。该模块未被弃用。警告意味着与Perl解释器捆绑在一起的Module :: Pluggable副本正在逐步淘汰。相反,您应该从CPAN安装副本。