======================================================
Проект: Универсальный конфигуратор
Модуль: Config/Дока
Автор:  Андрей Орлов
Версия: ${Id: }
------------------------------------------------------
Дата:   Mon Nov 19 21:09:12 MSK 2001
======================================================

Про класс Config я тоже кой-чего напишу. Это прототип конфигурации,
предоставляющий стандартную логику и набор стандартных ключей. Существует
два класса Config: Config & ConfigS. Отличие класса ConfigS в том, что в нем
могут быть созданы только те ключи, которые есть в базовой конфигурации,
передаваемой в качестве параметра при инициализации, причем значения этих
ключей должны быть того же самого типа.

Класс ConfigS является основным на сегодняшний день, поэтому использовать
следует именно его. Есть два способа настройки класса:

    1.  Передача при инициализации хэша с умолчаниями

        Если это не сделать, то нельзя будет создать ни одного ключа в
        конфигурации. Передачи хеша с умолчаниями достаточно для
        подавляющего большинства приложений.

    2.  Порождение своего класса

        Позволяет добавить ключи с более сложной обработкой, чем просто
        добавление в конфигурацию. Использование такого метода в текущей
        версии крайне не желательно: если необходима дополнительная
        инициализация, то ее лучше проводить в методе init() класса
        Application.
 
        При порождении класса новые обработчики ключей задаются как функции
        вида::

            switch_<ИМЯ_КЛЮЧА>(self,key[,arg[=<УМОЛЧАНИЕ>]]),
        
        где key - ключ, arg - значение ключюча.
       
        Обязательность, отсутствие или умолчание аргумента arg означет
        обязательность, отсутстствие или умолчание значения ключа.
        Обработчик должен сохранять разобранный ключ в хеше self.data таким
        образом, что бы печать этого значения допускала повторную загрузку в
        том же самом формате (т.е. если в конфиге задается список, то и
        ключу должно быть присвоено значение списка), если это невозможно,
        то и хрен с ним - в следущей версии попробуем решить это иначе.
 
Конфигурация, загружаемая в класс Config*, представляет собой список
деревьев, примерно следующего вида:

    [ {<arg>:<val>, <arg1>: {<arg>:<val>} } , { ..... }]

При разрешении любого ключа из любой ветви дерева просматриваются все
родительчкие узлы, а затем все корневые узлы деревьев, идущих в списке перед
данным.

Каждый элемент списка деревъев соотстветствует своему вызову парсера
конфигурации. Прасеры вызываются в следующем порядке:

    <Конфиг> ... <Конфиг> <Среда> <Командая строка>.

Конфигурация поддерживает следующие стандартные ключи:

    verbose         -- увеличить (задать) уровень трассировки,
  
    verbose-stderr  -- выводить трассировку на stderr,
  
    debug           -- запуск в отладочном режиме, не маскируются
    исключения,
  

    dump = type     -- вывести дамп конфигурации, тип может быть:
  
        detail  -- детальная схема конфигурации,
          
        content -- список секций конфигурации,
          
        plain   -- конфигурационный файл
          
    dump-min        -- минимальный уровень дампа конфигурации,
  
    dump-max        -- максимальный уровень дампа конфигурации,

    help = [chapter]-- вывести хелп, help=cfg - хелп на конфгурациюб
  
    exit            -- прекратить исполнение программы и выйти,

    cfg_dump        -- сохранить конфигурацию в виде бинарного дампа,
  
    cfg_load        -- загрузить конфигурацию из бинарного дамп,
  
    cfg_read        -- прочитать конфигурационный файл,
  
    сfg_clean       -- восстановить умолчания в конфигурации.

В общем, just click & enjoy ;)
======================================================
