Docs.
diff --git a/Blog/Settings.hs b/Blog/Settings.hs
index d2035c9..94a3149 100644
--- a/Blog/Settings.hs
+++ b/Blog/Settings.hs
@@ -12,15 +12,19 @@ import Framework.Forms.Types
import Invalidation
+-- | Handle request exception. Should end with returnNow. If it is just @return ()@, built-in handler will work.
requestExcHandler :: ExcHandler
requestExcHandler rq code msg = do
returnNow $ renderToResponse (show code++".html") [("error", C msg),
("request", C $ show rq),
("url", C $ uriPath $ rqURI rq)]
+-- | Handle controller exception. See notes for requestExcHandler.
controllerExcHandler :: ExcHandler
controllerExcHandler rq code msg = return ()
+-- | These functions may modify each Form.
+formProcessors :: [Form -> Form]
formProcessors = [simple]
simple :: Form -> Form
diff --git a/Framework/Signals.hs b/Framework/Signals.hs
index baaf9c5..205dbcd 100644
--- a/Framework/Signals.hs
+++ b/Framework/Signals.hs
@@ -18,7 +18,10 @@ signals = defaultSignals `M.union` connectSignals
defaultSignals = M.fromList []
-send :: Signal -> Model -> AController ()
+-- | Send a signal.
+send :: Signal -- ^ Signal name
+ -> Model -- ^ Parameter for signal
+ -> AController ()
send sig model =
case M.lookup sig signals of
Nothing -> return ()
diff --git a/README.ru b/README.ru
index 65f092f..7671742 100644
--- a/README.ru
+++ b/README.ru
@@ -111,3 +111,24 @@ controller = do
rq <- asks request -- Получить объект-запрос
doSomethingWith rq
...
+
+## Сигналы
+
+Фреймворк включает модуль Signals, который работает в общих чертах аналогично сигналам в Django. Главное отличие -- сигналы и их обработчики регистрируются не во время исполнения, а статически.
+
+## Исключения
+
+Также фреймворк включает систему "исключений". Различаются два типа исключений: возникающие в контроллере (Controller exception) и возникающие на стадии обработки запроса (Request exception). Вторые порождает сам фреймворк -- например, когда не может найти подходящего контроллера для обработки URL. В контроллере можно породить исключение функцией raiseC с двумя параметрами -- код ошибки (соответствует HTTP status code) и собственно сообщение об ошибке.
+
+По умолчанию работают простые встроенные обработчики исключений, но приложение может определить собственные (см. ниже).
+
+## Расширяемость
+
+Фреймворк является "точечно расширяемым". Это означает, что расширение функциональности фреймворка предусмотрено в некотором ограниченном количестве мест. Сейчас этими местами являются:
+
+ * Генерация форм: приложение может определить функции, через которые будет проходить каждая форма (Form). Например, можно добавлять дополнительные поля итп.
+ * Request Middlewares: это функции StaticConfig -> HttpRequest -> IO HttpRequest, через которые проходит каждый запрос прежде чем попасть в диспетчер URL.
+ * Response Middlewares: это функции StaticConfig -> HttpResponse -> IO HttpResponse, через которые проходит ответ прежде чем он будет отдан веб-сервером.
+ * Обработчики исключений: приложение может определить свои обработчики для request exceptions и controller exceptions.
+
+Все эти функции должны быть определены в приложении в модуле Settings.hs, оттуда их импортируют разные части фреймворка. В нём же определяется соответствие возможных сигналов и их обработчиков.
diff --git a/TODO b/TODO
index 4182cc7..7fa7d90 100644
--- a/TODO
+++ b/TODO
@@ -2,9 +2,9 @@ TODO
* Человеческая обработка завершения программы;
* Соответственно, все параметры, которые сейчас hard-coded, брать из конфига;
- * Более высокоуровневый интерфейс для кэша - чтоб было легко закэшировать результат всей функции;
- * Соответственно, простые средства для инвалидации кэша;
- * Более продвинутые и высокоуровневые функции генерации SQL;
+ * [PARTIALLY DONE] Более высокоуровневый интерфейс для кэша - чтоб было легко закэшировать результат всей функции;
+ * [PARTIALLY DONE] Соответственно, простые средства для инвалидации кэша;
+ * [PARTIALLY DONE] Более продвинутые и высокоуровневые функции генерации SQL;
* (?) Слой абстракции от диалекта SQL;
* (?) Генерация структуры Form по Model (с возможностью переопределить, или просто не использовать);
* (?) Автоматические CRUD-контроллеры;