Помощь Perlers! Кто-нибудь знает, что простой подход «вставить код здесь» принесет код из внешних файлов один раз во время компиляции в пакет?
Справочная информация:
У меня стандартный внутренний класс в стиле PBP, который становится довольно большим. Я хочу разбить код на несколько файлов, но не расширять класс. Оптимально, я бы просто вставлял код в раздел «Волшебный Джуджу» примера модуля (см. Ниже) один раз во время компиляции.
Я смотрел на AutoLoader как на средство для достижения этой цели. Однако есть две вещи, которые заставляют меня задуматься. Если бы я мог обойти это, это могло бы быть почти оптимальным решением:
Я не хочу разбивать каждый маленький сабвуфер на отдельный файл; только несколько файлов разумного размера (хотя использование подпрограмм в вызывающей программе - это нормально); и
Я не хочу откладывать компиляцию на каждом подпрограмме; некоторые подпрограммы, которые я хотел бы скомпилировать при первом использовании. Тем не менее, это, вероятно, не нарушает условия сделки.
Я знаю, что Moose предоставляет «Роли», что, я думаю, делает это хорошо, но по разным причинам Moose не подходит для этого проекта, как и Mouse.
Я использовал «require q (some / file)» в расположении «Magic JuJu», но это не поддерживает область постоянных переменных, то есть подпрограммы из внешнего файла не «видят» хэши атрибутов объекта правильно (другими словами, размещение require в верхней части файла будет иметь тот же эффект). Я мог бы обойти это, всегда используя сеттеры и геттеры. Так что это не нарушает условия сделки, но потребует немного времени на кодирование и накладных расходов на выполнение, которые я бы не стал нести.
Наконец, я не хочу расширять класс; у него уже есть множественное наследование. Я просто хочу, чтобы простой подход «вставьте код сюда» привел бы код один раз во время компиляции.
В итоге:
- (обязательно) импортирует код из внешних файлов в пространство имен пакета
- (Обязательно) Делает это только во время компиляции или с минимальными накладными расходами во время выполнения
- (обязательно) Не расширяет класс
- (желательно) С уважением вставить область видимости
Пример кода с комментарием «Волшебный Джуджу» ниже:
package T;
use strict;
use warnings;
########## BEGIN object persistent variables scope block ############
{
my %Attr_Name_Env;
## Constructor 'new'
#
sub new {
## Get and confirm arguments
#
my $class = shift;
my $href_arg = {@_};
my $name_env = $href_arg->{'name_env'};
## Bless anon scalar into class
#
my $obj_new = bless anon_scalar(), $class;
my $idx_self = ident $obj_new;
# Populate object attributes
#
$Attr_Name_Env{ $idx_self } = $name_env;
return $obj_new;
}
## END Constructor 'new'
sub DESTROY {... as you do ...}
sub t_get_name_env {
my $self = shift;
my $idx_self = ident $self;
return $Attr_Name_Env{ $idx_self };
}
## insert magic juju here
}
########## END object persistent variables scope block ############
1;
Может быть, НАЧАЛО блока с бредом и оценкой ...