Подскажите пожалуйста, как граматно реализовать следующее:
Пишу движек сайта, нужен конфиг в котором описаны переменные, нужен 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(...);