Mojolicious::Plugin::AnyData

Какое-то время назад я, просматривая на досуге один фреймворк на джаве, был обрадован интересной фиче — возможности прямо из yaml'а грузить в память некоторые структурированные данные и работать с ними с помощью ORM (Hybernate, кажется) так, как будто это данные, взятые из базы данных.

Тогда я подумал, нет ли способа организовать что-то похожее для Mojolicious. Был найден годный модуль DBD::AnyData, осталось только сделать плагин. Помимо всего прочего, добавлено несколько методов (пока только два) для удобства пользования плагином. 

Ссылка: https://github.com/shootnix/Mojolicious-Plugin-AnyData. Модуль пока не публикую на спане, желая для начала собрать некоторое кол-во багрепортов и предложений по улучшению. Отсюда просьба: критикуйте, замечайте, высказывайтесь, буду очень рад любому фидбэку. Ну и от посильной помощи не откажусь ;-)

Динамические грабли Perl

Известно, что Perl — динамический язык. Кроме всего прочего это означает создание переменных «на лету». Бороться с внезапно созданными переменными из-за простой опечатки мы знаем как — use strict. 

Но динамически создаются, как мы знаем, не только переменные, но и ключи хэша или ссылки на хэш, в этом случае use strict не помогает.

Допустим такую задачу: у вас есть массив, из которого нужно взять пять элементов. В качестве элементов у нас — хэш. Задача решается просто:

Думаю, объяснять этот пример не нужно, однако, есть условие, которое довольно просто не заметить: что, если $arrayref был изначально пуст? Что станет с ним после этих манипуляций? Правильно, он будет заполнен! 

В данном конкретном случае Perl заполнит $arrayref пустыми хэшами, которые создались динамически при помощи вызова $arrayref->[$i]->{somekey}.

Что делать, если это не входит в наши планы? Самый простой и надежный способ, конечно, следить внимательно за всем самому, не допуская подобного со стороны Perl'a. Но, немного порывшись на спане, было найдено решение для тех, кто ценит заботу о своем коде со стороны автоматических программ и решений:

Теперь прагма будет следить за тем, чтобы Perl не бесчинствовал почем зря, создавая динамически ненужные хэши.