#perl #oop #package
#perl #ооп #пакет
Вопрос:
Я пытаюсь избежать 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]
Возможно ли это?
Комментарии:
1.
XXX->new
и т.д. обычно возвращает ссылку, которая включена в пакетXXX
, но не является ссылкой на пакетXXX
, что бы это ни было. Возможно, вы могли бы уточнить свой вопрос.2. Извините, это не более понятно. Что такое ссылка на модуль? Похоже, вас могут заинтересовать объекты, благословленные в каждом пакете.
3. @mob objects тогда, извините, я действительно смущен этими терминами;-(
4. Обновлен вопрос @mob
5. «Я пытаюсь избежать Module::Pluggable и упростить задачу». — Вторая половина вашего предложения, похоже, противоречит первой 🙂
Ответ №1:
Вы должны иметь возможность просматривать этот modules/
каталог, который, по вашим словам, у вас есть, и собирать в нем список файлов. (Используйте opendir
или еще лучше, Path::Tiny для сбора списка файлов.) Затем:
my @classes = map {
(my $class = $_) =~ s{/}{::}g;
$class =~ s{.pmz}{};
$class;
} @files;
В приведенном выше примере я предполагаю довольно стандартное сопоставление имени файла с именем класса. Не стесняйтесь настраивать его, если он не подходит для вашей ситуации.
Как только у вас будет список классов, вы можете довольно легко получить список объектов обратно:
my @objects = map $_->new, @classes;
Лично я бы использовал Module::Pluggable, хотя. Не бойтесь предупреждений об устаревании. Модуль не является устаревшим. Предупреждения означают, что копия Module::Pluggable, которая поставляется в комплекте с интерпретатором Perl, постепенно удаляется. Вместо этого вы должны установить копию из CPAN.