changeset 265:6b6d4b2275a1

improved documentation
author cin
date Thu, 10 Jan 2013 03:25:02 +0400
parents c9c2ec29793f
children 89179bb8c388
files Lib/IMPL/DOM/Schema/ValidationError.pm Lib/IMPL/Web/View/TTControl.pm Lib/IMPL/Web/View/TTLoader.pm Lib/IMPL/Web/ViewResult.pm
diffstat 4 files changed, 184 insertions(+), 56 deletions(-) [+]
line wrap: on
line diff
--- a/Lib/IMPL/DOM/Schema/ValidationError.pm	Wed Jan 09 17:55:43 2013 +0400
+++ b/Lib/IMPL/DOM/Schema/ValidationError.pm	Thu Jan 10 03:25:02 2013 +0400
@@ -69,26 +69,26 @@
 
 =over
 
-=item C<[get] Node>
+=item C<[get] node>
 
 Узел в документе который привел к ошибке. Как правило это либо простые узлы, либо
 узлы, которые не могут присутствоать в данном месте по схеме.
 
 Данное свойство может быть C<undef>. 
 
-=item C<[get] Parent>
+=item C<[get] parent>
 
-Родительский узел в котором произошла ошибка. Используется в случаях, когда C<Node>
+Родительский узел в котором произошла ошибка. Используется в случаях, когда C<node>
 не указан, например, если по схеме должен существовать дочерний узел с определенным
 именем, а в реальном документе его нет.
 
 Также это свойство может использоваться при формировании сообщения.
 
-=item C<[get] Schema>
+=item C<[get] schema>
 
 Схема для C<Node> или узла который должен присутсвовать если C<Node> не задан.
 
-=item C<[get] Source>
+=item C<[get] source>
 
 Схема, проверка которой привела к возникновению ошибки. Поскольку схемы могут
 использовать ссылки, то данное свойство нужно для получения схемы узла, а не
@@ -98,7 +98,7 @@
 типа, например, C<IMPL::DOM::Schema::ComplexType>, а свойство C<Source> будет
 указывать именно на C<IMPL::DOM::Schema::Node>.
 
-=item C<[get] Message>
+=item C<[get] message>
 
 Возвращает форматированное сообщение об ошибке.
 
@@ -120,7 +120,7 @@
 my $node = $doc->selectSingleNode('user','name');
 
 # Получаем все ошибки относящиеся к данному узлу
-my @nodeErrors = grep { ($_->Node || $_->Parent) == $node } @errors;  
+my @nodeErrors = grep { ($_->node || $_->parent) == $node } @errors;  
 
 =end code
 
--- a/Lib/IMPL/Web/View/TTControl.pm	Wed Jan 09 17:55:43 2013 +0400
+++ b/Lib/IMPL/Web/View/TTControl.pm	Thu Jan 10 03:25:02 2013 +0400
@@ -142,39 +142,113 @@
 
 =head1 SYNPOSIS
 
+=begin text
+
+[%
+    META version = 1;
+    BLOCK INIT;
+        # this is a document scope
+        dojo.require.push( 'dijit/form/Input' );
+    END;
+    BLOCK CTOR;
+        # local to this block
+        TPreview = require('My/Org/TextPreview');
+        
+        # init control props 
+        this.dojoClass = this.dojoClass || 'dijit.form.Input';
+        this.visualClass = this.visualClass || 'classic';
+        this.childNodes = [];
+        
+        # init content
+        FOREACH text IN this.data;
+            this.childNodes.push( TPreview.new('preview', nodeValue = text ) );
+        END;
+        
+    END;
+%]
+
+<div class="$this.visualClass" data-dojo-type="$this.dojoClass">
+    [% FOREACH node IN this.childNodes %]
+        [% node.Render() %]
+        <hr />
+    [% END %]
+</div>
+
+=end text
+
 =head1 DESCRIPTION
 
+Представляет собой фрагмент документа, который имеет шаблон для отображения,
+набор свойств и т.п.
+
 =head2 BLOCKS
 
+=head3 META
+
+Атрибуты C<META> C<layout>, C<title> будут перенесены в свойства элемента
+управления. 
+
 =head3 INIT
 
-Данный блок шаблона управления выполняется один раз при создании первого экземпляра элемента управления,
-может использоваться для формирования заголовочной части документа, скрипта подключающего ajax модули
-при необходимости и т.п.
+Данный блок шаблона управления выполняется один раз при создании первого
+экземпляра элемента управления, в пространстве имен документа. Может
+использоваться для формирования заголовочной части документа, скрипта
+подключающего C<js> модули и т.п.
+
+Выполнение данного блока производится фабрикой элементов управления.
 
 =head3 CTOR
 
-данный блок выполняется каждый раз при создании нового экземпляра элемента управления, при этом переменная C<this>
-указывает на эземпляр элемента упарвления. Данный блок можно использовать для инициализации свойств элемента
+данный блок выполняется каждый раз при создании нового экземпляра элемента
+управления, при этом переменная C<this> указывает на эземпляр элемента
+упарвления. Данный блок можно использовать для инициализации свойств элемента
 управления.
 
 =head3 RENDER
 
-Данный блок выполняется при вызове метода C<Render()>, вывод данного блока и есть результат отображения элемента управления.
-Если в шаблоне нет блока C<RENDER>, то сам шаблон считается таковым. 
+Данный блок выполняется при вызове метода C<Render()>, вывод данного блока и
+есть результат отображения элемента управления. Если в шаблоне нет блока
+C<RENDER>, то сам шаблон считается таковым. 
 
 =head2 TEMPLATE VARS
 
-Каждый шаблон имеет собственное пространство имен, унаследованное от пространства имен фабрики элементов (которая в свою очередь наследует контекст документа).
-В шаблоне могут определяться новые переменные, которые разделяются между блоками. Также доступны стандартные переменные
+Каждый шаблон имеет собственное пространство имен, вложенное в пространство имен
+фабрики элементов (которая разделяет пространство имен документа). В шаблоне
+могут определяться новые переменные, однако они останутся локальными для блоков.
+
+Чтобы передать данные между блоками следует использовать ссылку на элемент
+управления C<this>.
+
+=begin text
+
+[%
+    BLOCK CTOR;
+        this.extraCssClass = 'active';
+        text = "this text will gone";
+    END;
+%]
+
+<div class="$this.extraCssClass">some text $text</div>
+
+=end text
+
+В примере выше переменная C<$text> установленная в конструкторе шаблона, при
+отображении элемента управления будет неопределена.
 
 =over
 
-=item * C<this> ссылка на объект элемента управления
+=item * C<this>
+
+ссылка на объект элемента управления
+
+=item * C<component>
 
-=item * C<component> ссылка на текущий шаблон, устанавливается автоматически в методе C<Template::Context::process>.
+ссылка на текущий шаблон, устанавливается автоматически в методе
+C<Template::Context::process>.
 
-=item * C<template> ссылка на шаблон элемента управления, для совместимости с C<TT>
+=item * C<template>
+
+ссылка на шаблон элемента управления, для совместимости с C<TT>
 
 =back
 
@@ -184,8 +258,9 @@
 
 =item * C<[get]context>
 
-Контекст элемента управления, хранит пременные шаблона. Наследуется от контекста фабрики элементов управления, который
-наследуется от контекста документа.
+Контекст элемента управления, хранит пременные шаблона. Передается в
+конструкторе. Фабрика элементов управления создает новый контекст пространство
+имен которого вложено в пространство имен документа.
 
 =item * C<[get,set]template>
 
@@ -193,11 +268,10 @@
 
 =item * C<AUTOLOAD>
 
-Для удобства работы с шаблоном, элементы управления предоставляю доступ к своим свойствам через метод C<AUTOLOAD>.
+Для удобства работы с шаблоном, элементы управления предоставляю доступ к своим
+свойствам через метод C<AUTOLOAD>. Имена свойств должны начинаться со строчной
+буквы.
 
 =back
 
-
-C<lang ru>
-
 =cut
\ No newline at end of file
--- a/Lib/IMPL/Web/View/TTLoader.pm	Wed Jan 09 17:55:43 2013 +0400
+++ b/Lib/IMPL/Web/View/TTLoader.pm	Thu Jan 10 03:25:02 2013 +0400
@@ -1,31 +1,33 @@
 package IMPL::Web::View::TTLoader;
 use strict;
 
-use IMPL::lang qw(:declare);
-
-use Template::Provider();
-use Template::Context();
 use Template::Constants qw(:status);
 
-use IMPL::Web::View::TTDocument();
-
-use parent qw(
-    IMPL::Object
-    IMPL::Object::Serializable
-);
-
-BEGIN {
-    public property options => PROP_ALL;
-    public property provider => PROP_GET | PROP_OWNERSET;
-    public property context => PROP_GET | PROP_OWNERSET;
-    public property ext => PROP_ALL;
-    public property layoutBase => PROP_GET | PROP_OWNERSET;
-    
-    public property isInitialized => PROP_GET | PROP_OWNERSET;
-    public property initializer => PROP_GET | PROP_OWNERSET;
-    
-    private property _globals => PROP_ALL;
-}
+use IMPL::Const qw(:prop);
+use IMPL::declare {
+    require => {
+        Provider => 'Template::Provider',
+        Context => 'Template::Context',
+        TTDocument => 'IMPL::Web::View::TTDocument',
+        Exception => 'IMPL::Exception',
+        ArgumentException => '-IMPL::InvalidArgumentException',
+        KeyNotFoundException => '-IMPL::KeyNotFoundException'
+    },
+    base => [
+        'IMPL::Object' => undef,
+        'IMPL::Object::Serializable' => undef
+    ],
+    props => [
+        options => PROP_RO,
+        provider => PROP_RO,
+        context => PROP_RO,
+        ext => PROP_RO,
+        layoutBase => PROP_RO,
+        isInitialized => PROP_RO,
+        initializer => PROP_RO,
+        _globals => PROP_RW
+    ]
+};
 
 sub save {
 	my ($this,$context) = @_;
@@ -61,9 +63,9 @@
     $this->layoutBase($args{layoutBase}) if $args{layoutBase};
     
     # to aviod cyclic references we need to do a copy of $refOpts
-    $refOpts->{LOAD_TEMPLATES} = $this->provider(new Template::Provider( { %$refOpts } ));
+    $refOpts->{LOAD_TEMPLATES} = $this->provider(Provider->new( { %$refOpts } ));
     
-    $this->context(new Template::Context($refOpts));
+    $this->context(Context->new($refOpts));
 }
 
 sub document {
@@ -78,7 +80,7 @@
     $opts->{STASH} = $this->context->stash->clone();
     $opts->{LOAD_TEMPLATES} = $this->provider;
     
-    return new IMPL::Web::View::TTDocument( $tt, $opts, $this, $vars );
+    return TTDocument->new( $tt, $opts, $this, $vars );
 }
 
 sub template {
@@ -86,16 +88,16 @@
     
     $name =~ s/^\s+|\s+$//g;
     
-    die new IMPL::InvalidArgumentException("A valid template name is required") unless length $name;
+    die ArgumentException->new("A valid template name is required") unless length $name;
     
     $name = $this->_appendExt($name);
     
     my ($tt,$error) = $this->provider->fetch($name);
     
     if (defined $error and $error == STATUS_DECLINED) {
-        die new IMPL::KeyNotFoundException($name);
+        die KeyNotFoundException->($name);
     } elsif (defined $error and $error == STATUS_ERROR) {
-        die new IMPL::Exception("Failed to load a template", $name, $tt);
+        die Exception->new("Failed to load a template", $name, $tt);
     }
     
     return $tt;
@@ -136,7 +138,7 @@
             $this->context->process($initializer,$this->_globals);
         };
         if (my $e = $@) {
-            die new IMPL::Exception("Failed to process an initializer", $this->initializer, $e);
+            die Exception->new("Failed to process an initializer", $this->initializer, $e);
         }
         
         $this->isInitialized(1);
@@ -179,9 +181,60 @@
 
 =head1 DESCRIPTION
 
+Провайдер для загрузки шаблонов и документов. Имеет собственное пространство
+имен, контекст выполнения шаблонов. Контект загрузчика инициализируется
+шаблоном, в котором определяются глобальные переменные, которые будут доступны
+в документах, однако их изменения будут локализованы.
+
+Инициализация контекста провайдера происходит при первой загрузке любого
+документа.
+
 =head1 MEMBERS
 
+=head2 C<CTOR($options,%args)>
+
+=over
+
+=item * C<$options>
+
+Параметры контекста загрузчика, контексты документов и элементов управления
+также унаследуют эти свойства. Напрямую передаются в конструктор
+C<Template::Context>.
+
+=item * C<%args>
+
+Именованные параметы загрузчика.
+
+=over
+
+=item * C<ext>
+
+Расширение, которое будет добавляться к именам шаблонов и документов (если оно
+не будет указано явно).
+
+=item * C<initializer>
+
+Имя шаблона, который будет использован для инициализации контекста.
+
+=item * C<globals>
+
+Глобальные переменнын, которые будут переданы в контекст.
+
+=item * C<layoutBase>
+
+Путь к шаблонам для оформления документов. Каждый документ может задавать свой
+C<layout> указанный в его C<META> блоке или конструкторе.
+См. C<IMPL::View::TTDocument>.
+
+=back
+
+=back
+
 =head2 C<document($docName)>
 
+Загружает документ с именем C<$docName>. При необходимости к нему будет
+добавлено расширение, указанное в свойстве C<ext>. Это единственно полезный
+метод провайдера.
+
 =cut
 
--- a/Lib/IMPL/Web/ViewResult.pm	Wed Jan 09 17:55:43 2013 +0400
+++ b/Lib/IMPL/Web/ViewResult.pm	Thu Jan 10 03:25:02 2013 +0400
@@ -49,7 +49,8 @@
 
 =head1 DESCRIPTION
 
-Сожержит в себе информацию для представления модели.
+Сожержит в себе информацию для представления модели. Также включает поля для
+заголовков ответа C<cookies>, C<headers>, C<status>.
 
 =head1 MEMBERS