Не знаех за Module::Pluggable, оказва се удобно решение.
Това е кратък пример, ако не съм обяснил добре, питай.
командите са в bold:
files in the testing dir `ls -R`
.:
MyParser MyParser.pm test.pl
./MyParser:
Plugin
./MyParser/Plugin:
A.pm B.pm
cat test.pl
#!/usr/bin/perl
use strict;
use warnings;
use MyParser;
my $obj = MyParser->new({});
### praktichnoto w plugin abstrakciqta:
$obj->parse("tovA e teST");
cat MyParser
package MyParser;
use Module::Pluggable require => 1;
sub new {
my $class = shift;
my $self = shift;
bless $self, $class
}
sub parse {
my $self = shift;
my $string = shift;
for my $plugin ($self->plugins) {
$plugin->parse($string);
}
}
1;
cat MyParser/Plugin/A.pm
package MyParser::Plugin::A;
sub new {
my $class = shift;
my $self = shift;
bless $self, $class
}
sub parse {
my $self = shift;
my $data = shift;
print "plyginyt '" . __PACKAGE__ . "' implementira lowercase: " . lc $data . "\n";
}
1;
cat MyParser/Plugin/B.pm
package MyParser::Plugin::B;
sub new {
my $class = shift;
my $self = shift;
bless $self, $class
}
sub parse {
my $self = shift;
my $data = shift;
print "plyginyt '" . __PACKAGE__ . "' implementira uppercase: " . uc $data . "\n";
}
1;
perl test.pl следва да изведе на STDOUT това:
plyginyt 'MyParser::Plugin::A' implementira lowercase: tova e test
plyginyt 'MyParser::Plugin::B' implementira uppercase: TOVA E TEST