Итак, как уже говорил, общая идея спёрта из модульных CMS. Суть: есть ядро и есть модули (компоненты), весь функционал отдан на откуп модулям. Ядро обеспечивает взаимодействие этих модулей и единый интерфейс работы с ними.
На данный момент структура следующая: все подключаемые компоненты наследуются от класса BaseComponent и находятся в папке components. Ядро при старте проверяет все файлы (кроме файлов, обозначенных в restrict.lst) в этой папке и ищет все классы, наследующиеся от BaseComponent, после чего создаёт по одному экземпляру каждого класса. Затем последовательно выполняются следующие действия: 1. Метод set_start_settings - в эту процедуру передаётся словарь, прочитанный из файла config (в корне программы) если в нём присутствует секция с названием модуля, в противном случае передаётся пустой словарь. Используется для передачи компоненту каких-то базовых параметров, если это необходимо. Формат - ключ-значение в текстовом виде (возможно сделаю юникод для значений). Компонент должен обработать этот словарь самостоятельно. Если данная процедура не переопределена, то процедура базового класса просто сохраняет ссылку на словарь как self.settings
2. Метод set_global_dictionary - передаётся ссылка на глобальный словарь, который будет использоваться для взаимодействия между компонентами, в т.ч. компонентами и ядром. Формат словаря свободный, но рекомендуется использовать вложенный словарь для каждого компонента. Ключом вложенного словаря в этом случае должна являться аббревиатура (короткое название) компонента.
3. before_direct_import - вызывается без параметров. Сюда помещают действия, которые компоненту необходимо выполнить до инициализации DirectStart, например изменение разрешения или переключение в полноэкранный режим.
4. Выполняется импорт DirectStart (базовая инициализация графики звука и пр.)
5. Метод after_direct_import - вызывается без параметров. Осуществляются все оставшиеся действия по инициализации компонента.
-------------------------
Имена (self.name) всех компонентов должны быть уникальными.
-------------------------
В ближайшее время планирую реализацию порядка загрузки модулей на основании "веса" и отслеживание зависимостей (если какой-то модуль требует наличия другого модуля)
-------------------------
На данный момент есть три работающих компонента
sample - минимальный компонент, просто печатает "It's HelloWorld sample module."
wxframe - оборачивает окно панды в GUI wx, показывает пример вызова до инициализации DirectStart. Вероятно, будет развиваться как базовая оболочка в которую можно будет навешивать свои элементы управления.
sampleCamera - реализует альтернативное управление камерой, показывает работу с конфигом и глобальным словарём.
=======================
В итоге это всё нам даёт то самое построение по кирпичикам-компонентам с одной стороны, а с другой - чёткую реализацию разделения областей работы - программеры, работающие над ядром; программеры, создающие модули; конечные пользователи/дизайнеры, которые из модулей собирают то, что им требуется.