Подскажите пожалуйста, как граматно реализовать следующее: Пишу движек сайта, нужен конфиг в котором описаны переменные, нужен default-конфиг в котором описаны "константы". Переменные конфига и "константы" частично рассчитываются динамически - т.е. 1 раз при загрузке соответствующего конфига. Основной движек должен в начале загрузить конфиг, конфиг должен загрузить default-конфиг. Переменные конфига и "константы" должны быть доступны движку. Далее, движек должен загрузить и проинициализировать основные библиотеки/модули и обеспечить работу с ними. По необходимости движек должен подгружать модули для расширения функциональности если это нужно (работа с БД). Посмотрел много OpenSource решений, сделал вариант приведенный ниже. Посоветуйте как его оптимизировать? Сделал такой вариант (мне кажется это плохой вариантом): Конфиг - 'engine_config.pl', в нем: (из него переменные доступны как '$ENGINE::VAR_NAME') { package ENGINE; $DIR_SITE_ENGINE = '/dir/...'; $DIR_SITE_ENGINE = '/dir/...'; $DB_HOST = 'www.host.com'; # и так далее } require 'engine_def_config.pl'; Default-конфиг - 'engine_def_config.pl', в нем: (его переменные подгружаются в тот же userspace) { package ENGINE; $DEF_VAR1 = 'value1'; $DEF_VAR2 = 'value2'; # и так далее } Загрузчик модулей 'engine.pm', в нем: package ENGINE; use Exporter; use strict; use lib $ENGINE::DIR_SITE_ENGINE_LIB; use lib $ENGINE::DIR_SITE_ENGINE_LIB_OTHER; require $ENGINE::DIR_SITE_ENGINE_LIB.'engine_config.pl'; use Carp qw(longmess); # Modules checks $CT::HANDLE_LOGGER = undef; eval { require ENGINE::Logger; }; if ($@) { print "No Logger"; } else { $CT::HANDLE_LOGGER = ENGINE::Logger->new(); } # Logger sub LOG { $ENGINE::HANDLE_LOGGER->add(@_) if ($ENGINE::HANDLE_LOGGER); } # и так далее В основном движке: require '..../lib/engine_config.pl'; use strict; use lib $ENGINE::DIR_SITE_ENGINE_LIB; use lib $ENGINE::DIR_SITE_ENGINE_LIB_OTHER; use ENGINE; # That module will load all needed... &ENGINE::LOG('info', 'Testing 1'); Хочется оптимизировать следующее: - не хочеся в каждом модуле писать 'use lib $ENGINE::DIR_SITE_ENGINE_LIB;', хетелось бы 1 раз это cдеалть чтобы все модули знали. - не хочеся в каждом модуле писать require '..../lib/engine_config.pl', хетелось бы 1 раз это cдеалть чтобы все модули знали. - надо чтобы движек мог при необходимости подгружать модули (например для работы с БД), не хочется во всех таких модулях делать 'use lib $ENGINE::DIR_SITE_ENGINE_LIB;' и 'require '..../lib/engine_config.pl'' - кстати 'require '..../lib/engine_config.pl'' в кадом модуле заново дергает 'engine_config.pl' и рассчитывает в нем переменные заново или это всетаки делается 1 раз? - хочется граматно подгружать необходимые модули чтобы они были доступны из движка, т.е. делать типа "requre 'module.pm'" для модулей вида: package ENGINE; use Exporter; use strict; use lib $ENGINE::DIR_SITE_ENGINE_LIB; use lib $ENGINE::DIR_SITE_ENGINE_LIB_OTHER; require $ENGINE::DIR_SITE_ENGINE_LIB.'engine_config.pl'; use Carp qw(longmess); # Modules checks $CT::HANDLE_DB = undef; eval { require ENGINE::DB; }; if ($@) { die "No DB"; } else { $CT::HANDLE_DB = ENGINE::DB->new(); } sub DB_OPEN { ... } Вызов функций такого модуля будет через: ENGINE::DB_OPEN(...);