Несмотря на наличие примерного плана разработки, как он описан в нашей заявке [1], первые же дни работы ввергли меня в замешательство. Слишком много вариантов реализации, идей и мнений. Наша IRC канал и рассылка стали необычно активными [2], Daniel Ruoso предложил свой вариант диспатчера [3].
Чтобы справится с хаосом в голове, я постарался выделить главное для себя, и пришел к первому тезису:
-- Максимально использовать стандартные инструменты Perl6.
Perl6 "большой" и богатый язык. Создавая фреймворк мы должны минимизировать число надстроек. Код должен быть организован с использованием стандартных классов, модулей, ролей. Не нужно много специфичной магии. Эта базовая мысль помогла мне выбрать позицию по активно обсуждаемому диспатчеру:
-- Использовать Perl6 MMD (Milti Methods Dispatcher[4]) для диспетчеризации запросов.
Moritz Lenz поддержал эту мысль и предложил свой, простой вариант реализации. Совмещение этой мысли с архитектурой REST [5] и влиянием Waves [6] навела меня на организацию код в виде ресурсов. Где ресурс это класс, а его методы, это собственно методы HTTP:
class Topic {
multi method GET () { ... } # index
multi method GET (Int $id) { ... } #show Topic by id
multi method PUT (Int $id, %data) { ... } # update Topic by id
multi method POST (%data) { ... } # create new Topic
...
}
Роль диспатчера при таком подходе -- выбрать верный ресурс для вызова метода, остальное делает MMD. Развивая эту мысль я делаю набросок, который назвал Forest, посмотрим, что из этого получится.
Одна из первых мыслей высказанных Ruoso -- взять идею :Chained из Catalyst [7], и построить всю диспетчеризацию как расширенную систему цепочек. Мне нравится эта идея и в Forest я хочу реализовать возможность связывания ресурсов в цепочку.
Еще один принцип, который я бы хотел заложить в основу -- возможность встраивать приложения. Так, чтобы, например, разработанный на базе нашего фреймворка блог, мог быть встроен в другое приложение на базе фреймворка.
Моя первая неделя работы над грантом была омрачена простудой. Эффективно поработать удалось совсем не много и мне пришлось сделать перерыв. Надеюсь продолжить работу с середины следующей недели.
(С удивлением обнаружил, что доступ к perl6.ru для меня закрыт. Поэтому посты по теме пока пишу сюда.)
1: http://github.com/masak/web/blob/b5b6bf
2: используем IRC канал #november-wiki на irc.freenode.org и рассылку november-wiki@googlegroups.com
3: смотрите логи IRC начиная с http://irclog.perlgeek.de/november-w
4: http://feather.perl6.nl/syn/S12.htm
5: http://en.wikipedia.org/wiki/Representa
6: http://rubywaves.com/
7: http://www.catalystframework.org/