diff Lib/IMPL/Web/View/TTLoader.pm @ 265:6b6d4b2275a1

improved documentation
author cin
date Thu, 10 Jan 2013 03:25:02 +0400
parents 5c82eec23bb6
children 546957c50a36
line wrap: on
line diff
--- 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