#Загрузчик библиотек
Предварительно рекомендуется прочитать статью "Подключение внешних библиотек".
Движок OneScript в общем случае никак не регламентирует содержимое конкретной библиотеки. Когда компилятор встречает в коде директиву #Использовать он выполняет поиск указанного каталога библиотеки и запускает процедуру ее загрузки. При этом, алгоритм загрузки (знающий, как именно трактовать содержимое каталога библиотеки) может быть переопределен в специальном файле package-loader.os, который расположен в корне хранилища библиотек.
Модуль загрузчика вызывается движком OneScript в момент начала загрузки библиотеки. Примерная аналогия - модуль документа в платформе 1С:Предприятие. Система вызывает метод "ПередЗаписью" и позволяет разработчику как-то управлять процессом записи в БД.
Иными словами, в движке существует объект "Загрузчик", который имеет скриптовый модуль, определяемый извне движка.
##Общие принципы загрузки
Библиотека может добавить в область видимости скрипта 2 вида сущностей: классы и модули. Каждая библиотека может включать в себя неограниченное количество классов и модулей.
Класс
Под классом понимается новый тип в системе типов приложения. Экземпляры объектов этого типа создаются через оператор Новый.
// подключаем функционал JSON
#Использовать json
Парсер = Новый ПарсерJSON(); // Тип ПарсерJSON объявлен в библиотеке
Модуль
Модуль это то же самое, что ОбщийМодуль в системе 1С:Предприятие. Модуль - это свойство в глобальном контексте, методы которого мы можем вызывать из языка.
// подключаем функционал JSON
#Использовать json
Студент = Новый Структура("Имя,Фамилия", "Иван", "Петров");
// Модуль "РаботаСJSON" объявлен в библиотеке и доступен благодаря директиве #Использовать
РаботаСJSON.ЗаписатьОбъект(Студент, "C:\students.json");
#Объект "ЗагрузчикБиблиотек"
Внутренний объект системы, загружающий внешние объекты в область видимости приложения.
Методы
ДобавитьКласс(Знач ИмяФайла, Знач Идентификатор)
Метод регистрирует новый тип в системе типов. В параметре "ИмяФайла" передается имя файла, реализующего класс, в параметре "Идентификатор" - имя класса, как он будет выглядеть в системе.
// файл package-loader.os
ДобавитьКласс("C:\moneygen.os", "ГенераторДенег");
// файл основного скрипта
Генератор = Новый ГенераторДенег;
Генератор.ДайДенег(100500);
ДобавитьМодуль(Знач ИмяФайла, Знач Идентификатор)
Метод регистрирует новый модуль в глобальном контексте. В параметре "ИмяФайла" передается имя файла, реализующего модуль, в параметре "Идентификатор" - имя модуля, как он будет выглядеть в системе.
// файл package-loader.os
ДобавитьМодуль("C:\worldcontrol.os", "УправлениеМиром");
// файл основного скрипта
УправлениеМиром.СделатьВсемХорошо(Истина);
События
ПриЗагрузкеБиблиотеки(Путь, СтандартнаяОбработка, Отказ)
Событие вызывается, когда система определила конкретный каталог библиотеки, перед попыткой загрузки этой библиотеки.
Параметры события
- Путь - полный путь к каталогу загружаемой библиотеки.
- СтандартнаяОбработка - позволяет использовать встроенный алгоритм загрузки (см. ниже)
- Отказ - если обработчик события взводит флаг "Отказ", то генерируется ошибка "Библиотека не может быть загружена".
Стандартная обработка загрузки
Если обработчик не сбросил флаг стандартной обработки, то выполняется стандартный алгоритм загрузки:
- Находятся файлы в каталоге библиотеки с расширением .os;
- Если имя файла удовлетворяет правилам формирования идентификаторов он загружается, как модуль
- Имя модуля будет таким же, как имя файла
Таким образом, если библиотека содержит только общие модули, то достаточно назвать файлы, как они должны выглядеть в языке и разместить их в каталоге библиотеки.