Использование MooseX::Singleton в Catalyst-приложении

Использование MooseX::Singleton в Catalyst-приложении на конкретном примере, при реализации работы с конфигурационными данными. Использование паттерна «Singleton» в Catalyst-приложении. Примеры кода. Примеры использования Class::Accessor.

Синтаксис:

 

Пример использования MooseX::Singleton

Задача:

В catalyst-приложении планируется использование внешнего конфигурационного файла. Требуется,
чтобы файл был прочитан только один раз, и в дальнейшем, все модули приложения имели дело с одним
объектом. Для этого:

  1. Создаем класс Config, который осуществляет получение конфигурационных данных, их обработку.
  2. Создаем класс SingletonConfig, который реализует идеи паттерна Singleton и позволяет создать
    объект-одиночку.
  3. Передаем данные конфига Catalyst-приложению.

 

Config.pm

Config.pm реализует доступ к конфигурационным данным. В приведенном примере, конфиг — это всего лишь хеш. Можно определить содержимое хеша так, как сделано в примере, а можно — взять данные из файла, распарсить и уже потом поместить их в хеш.

 

Что такое Class::Accessor

Class::Accessor используется для автоматического создания функция-аксессоров. Аксессоры (от англ. access — доступ) — это функции, которые реализуют доступ к внутренним данным объекта.

Т.е. вместо того, чтобы писать для каждого поля объекта код:

Можно использовать Class::Accessor и создать функции-аксессоры одной строкой:

  • Метод mk_accessors() позволяет создать аксессор и для записи данных в поле объекта, и для чтения данных из него.
  • Чтобы создать аксессор только для чтения данных (getter), можно использовать метод mk_ro_accessors() .
  • Для создания аксессоров, которые позволяют только записывать данные, но не получать их (setter), можно использовать метод mk_wo_accessors() .

В дальнейшем, созданный аксессор можно использовать:

Вызов SUPER::new позволяет использовать унаследованный у Class::Accessor метод new(), чтобы создать объект собственного класса.

 

SingletonConfig.pm

 

MyApp.pm

Метод instance() — специальная альтернатива методу new() — либо создает новый объект, либо возвращает ссылку на уже существующий.

$c->config (в данном случае __PACKAGE__->config) — возвращает или получает ссылку на хеш, который содержит конфигурационные данные для Catalyst-приложения.

 

MyApp::Controller::Root

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

 

Полезные ссылки

search.cpan.org: MooseX::Singleton