Я пытаюсь включить старую версию модуля динамически
В настоящее время у нас есть класс, который использует модуль ... очень упрощенный вопрос
use Modulev1;
our @ISA = qw( Modulev1 );
sub new {
my $class = shift or return
my $self = $class::SUPER::new( @_ ) or return;
$self->do_stuff();
$self;
}
У нас есть старый модуль, который имеет те же имена методов / переменные, но различную кодировку для другой версии API на удаленном сервере, которую я хотел бы подключить в качестве опции.
use Modulev1;
use Modulev2;
our @ISA = qw( Modulev1 );
sub new {
my $class = shift or return;
my %args = @_;
if( $args{ use_version_2 } ) {
@ISA = qw( Modulev2 );
}
my $self = $class::SUPER::new( \%args ) or return;
$self->do_stuff();
$self;
}
Это кажется работать одним способом (получает результаты), но это похоже на неправильный подход, и я получаю несколько предупреждений, таких как «модуль подпрограммы константы: переменная переопределена в /opt/perl/lib/5.30.1/Exporter.pm», что делает смысл в том, что он пытается определить эти константы дважды в каждой версии, и это кажется неправильным и склонным к будущим ошибкам.
Итак, есть 2 основных вопроса
1) Есть ли проблемы с переназначением @ISA , как у меня.
2) Есть ли лучший чистый способ попробовать и использовать 2 версии одного и того же модуля в коде, чем этот уродливый хак, подверженный ошибкам? Такое ощущение, что я должен как-то хранить модули более раздельно, чтобы они не могли пытаться делать что-то вроде переопределения констант.
Редактировать: я также попытался динамически добавить случай 'use module', но это кажется, что та же проблема, и кажется, что это будет неэффективно, так как это вызывается много раз.
Редактировать: просто чтобы прояснить, сценарий может вызывать объект несколько раз в течение одного запуска, но использовать разные версии.