动态加载Perl模块
我正在尝试创建一个可扩展的系统,通过该系统,我可以编写一个新模块作为处理程序。我希望程序自动加载放入Handlers目录并符合Moose::Role接口的任何新的.pm文件 我想知道是否有一个Perl模块或一个更受Moose认可的方法来自动完成这项工作?这是我到目前为止构建的内容,但它似乎有点冗长,必须有一种更简单的方法来实现动态加载Perl模块,perl,dynamic,moose,perl-module,Perl,Dynamic,Moose,Perl Module,我正在尝试创建一个可扩展的系统,通过该系统,我可以编写一个新模块作为处理程序。我希望程序自动加载放入Handlers目录并符合Moose::Role接口的任何新的.pm文件 我想知道是否有一个Perl模块或一个更受Moose认可的方法来自动完成这项工作?这是我到目前为止构建的内容,但它似乎有点冗长,必须有一种更简单的方法来实现 handler.pl包含: #!/usr/bin/perl use Handler; use Data::Dumper;
handler.pl
包含:
#!/usr/bin/perl
use Handler;
use Data::Dumper;
my $base_handler = Handler->new();
$base_handler->load_modules('SysG/Handler');
print Dumper($base_handler);
package Handler;
use Moose;
has 'handlers' => ( traits => ['Array'], handles => { add_handler => 'push' } );
sub load_modules {
my ($self,$dir) = @_;
push(@INC, $dir);
my @modules = find_modules_to_load($dir);
eval {
# Note that this sort is important. The processing order will be critically important.
# The sort implies the sort order
foreach my $module ( sort @modules) {
(my $file = $module) =~ s|::|/|g;
print "About to load $file.pm for module $module\n" ;
require $file . '.pm';
$module->import();
my $obj = $module->new();
$self->add_handler($obj);
1;
}
} or do {
my $error = $@;
print "Error loading modules: $error" if $error;
};
}
sub find_modules_to_load {
my ($dir) = @_;
my @files = glob("$dir/*.pm");
my $namespace = $dir;
$namespace =~ s/\//::/g;
# Get the leaf name and add the System::Module namespace to it
my @modules = map { s/.*\/(.*).pm//g; "${namespace}::$1"; } @files;
die "ERROR: No classifier modules found in $dir\n" unless @modules;
return @modules;
}
1;
package SysG::Handler::0001_HandleX;
use Moose;
1;
package SysG::Handler::0002_HandleY;
use Moose;
1;
Handler.pm
包含:
#!/usr/bin/perl
use Handler;
use Data::Dumper;
my $base_handler = Handler->new();
$base_handler->load_modules('SysG/Handler');
print Dumper($base_handler);
package Handler;
use Moose;
has 'handlers' => ( traits => ['Array'], handles => { add_handler => 'push' } );
sub load_modules {
my ($self,$dir) = @_;
push(@INC, $dir);
my @modules = find_modules_to_load($dir);
eval {
# Note that this sort is important. The processing order will be critically important.
# The sort implies the sort order
foreach my $module ( sort @modules) {
(my $file = $module) =~ s|::|/|g;
print "About to load $file.pm for module $module\n" ;
require $file . '.pm';
$module->import();
my $obj = $module->new();
$self->add_handler($obj);
1;
}
} or do {
my $error = $@;
print "Error loading modules: $error" if $error;
};
}
sub find_modules_to_load {
my ($dir) = @_;
my @files = glob("$dir/*.pm");
my $namespace = $dir;
$namespace =~ s/\//::/g;
# Get the leaf name and add the System::Module namespace to it
my @modules = map { s/.*\/(.*).pm//g; "${namespace}::$1"; } @files;
die "ERROR: No classifier modules found in $dir\n" unless @modules;
return @modules;
}
1;
package SysG::Handler::0001_HandleX;
use Moose;
1;
package SysG::Handler::0002_HandleY;
use Moose;
1;
然后,我创建了一个名为SysG/Handler的目录,并添加了两个.pm文件,这些文件通常会符合Moose::Role(好像要定义一个必须遵循的接口)
SysG::Handler::0001_HandleX.pm
存根包含:
#!/usr/bin/perl
use Handler;
use Data::Dumper;
my $base_handler = Handler->new();
$base_handler->load_modules('SysG/Handler');
print Dumper($base_handler);
package Handler;
use Moose;
has 'handlers' => ( traits => ['Array'], handles => { add_handler => 'push' } );
sub load_modules {
my ($self,$dir) = @_;
push(@INC, $dir);
my @modules = find_modules_to_load($dir);
eval {
# Note that this sort is important. The processing order will be critically important.
# The sort implies the sort order
foreach my $module ( sort @modules) {
(my $file = $module) =~ s|::|/|g;
print "About to load $file.pm for module $module\n" ;
require $file . '.pm';
$module->import();
my $obj = $module->new();
$self->add_handler($obj);
1;
}
} or do {
my $error = $@;
print "Error loading modules: $error" if $error;
};
}
sub find_modules_to_load {
my ($dir) = @_;
my @files = glob("$dir/*.pm");
my $namespace = $dir;
$namespace =~ s/\//::/g;
# Get the leaf name and add the System::Module namespace to it
my @modules = map { s/.*\/(.*).pm//g; "${namespace}::$1"; } @files;
die "ERROR: No classifier modules found in $dir\n" unless @modules;
return @modules;
}
1;
package SysG::Handler::0001_HandleX;
use Moose;
1;
package SysG::Handler::0002_HandleY;
use Moose;
1;
SysG::Handler::0002_HandleX.pm
存根包含:
#!/usr/bin/perl
use Handler;
use Data::Dumper;
my $base_handler = Handler->new();
$base_handler->load_modules('SysG/Handler');
print Dumper($base_handler);
package Handler;
use Moose;
has 'handlers' => ( traits => ['Array'], handles => { add_handler => 'push' } );
sub load_modules {
my ($self,$dir) = @_;
push(@INC, $dir);
my @modules = find_modules_to_load($dir);
eval {
# Note that this sort is important. The processing order will be critically important.
# The sort implies the sort order
foreach my $module ( sort @modules) {
(my $file = $module) =~ s|::|/|g;
print "About to load $file.pm for module $module\n" ;
require $file . '.pm';
$module->import();
my $obj = $module->new();
$self->add_handler($obj);
1;
}
} or do {
my $error = $@;
print "Error loading modules: $error" if $error;
};
}
sub find_modules_to_load {
my ($dir) = @_;
my @files = glob("$dir/*.pm");
my $namespace = $dir;
$namespace =~ s/\//::/g;
# Get the leaf name and add the System::Module namespace to it
my @modules = map { s/.*\/(.*).pm//g; "${namespace}::$1"; } @files;
die "ERROR: No classifier modules found in $dir\n" unless @modules;
return @modules;
}
1;
package SysG::Handler::0001_HandleX;
use Moose;
1;
package SysG::Handler::0002_HandleY;
use Moose;
1;
将所有这些放在一起,Data::Dumper结果是:
$VAR1 = bless( {
'handlers' => [
bless( {}, 'SysG::Handler::0001_HandleX' ),
bless( {}, 'SysG::Handler::0002_HandleY' )
]
}, 'Handler' );
所以,现在我重复我原来的问题:必须有一种更简单的方法,或者模块或Moose方法来自动加载特定目录中的任何模块
有没有驼鹿专家能在这里提供帮助?相关: