Mercurial > pub > Impl
changeset 300:bf3af33b9003
sync
author | cin |
---|---|
date | Fri, 22 Mar 2013 01:05:11 +0400 |
parents | bd79145657e5 |
children | aeeb57a12046 |
files | Lib/IMPL/Web/View/TTControl.pm Lib/IMPL/Web/View/TTDocument.pm Lib/IMPL/Web/View/TTFactory.pm |
diffstat | 3 files changed, 31 insertions(+), 55 deletions(-) [+] |
line wrap: on
line diff
--- a/Lib/IMPL/Web/View/TTControl.pm Thu Mar 21 16:00:09 2013 +0400 +++ b/Lib/IMPL/Web/View/TTControl.pm Fri Mar 22 01:05:11 2013 +0400 @@ -31,7 +31,7 @@ } } -our $AutoloadRegex = qr/^[a-z]/; +our $AUTOLOAD_REGEX = qr/^[a-z]/; sub CTOR { my ($this,$template,$context,$attrs) = @_; @@ -96,7 +96,7 @@ return if $method eq 'DESTROY'; - if ($method =~ /$AutoloadRegex/) { + if ($method =~ /$AUTOLOAD_REGEX/) { my $this = shift; die OperationException->new("can't invoke method '$method' on an unblessed reference") unless blessed $this; @@ -166,19 +166,6 @@ Выполнение данного блока производится фабрикой элементов управления. -=head3 CTOR - -данный блок выполняется каждый раз при создании нового экземпляра элемента -управления, при этом переменная C<this> указывает на эземпляр элемента -упарвления. Данный блок можно использовать для инициализации свойств элемента -управления. - -=head3 RENDER - -Данный блок выполняется при вызове метода C<Render()>, вывод данного блока и -есть результат отображения элемента управления. Если в шаблоне нет блока -C<RENDER>, то сам шаблон считается таковым. - =head2 TEMPLATE VARS Каждый шаблон имеет собственное пространство имен, вложенное в пространство имен @@ -223,24 +210,22 @@ =head1 MEMBERS -=over - -=item * C<[get]context> +=head2 C<[get]context> -Контекст элемента управления, хранит пременные шаблона. Передается в -конструкторе. Фабрика элементов управления создает новый контекст пространство -имен которого вложено в пространство имен документа. +Контекст элемента управления, хранит пременные шаблона. Фабрика элементов +управления создает новый контекст пространство имен которого вложено в +пространство имен документа. -=item * C<[get,set]template> +Контекст следует использовать только при рендеринге документа. + +=head2 C<[get,set]template> C<Template::Document> Шаблон элемента управления. -=item * C<AUTOLOAD> +=head2 C<AUTOLOAD> Для удобства работы с шаблоном, элементы управления предоставляю доступ к своим свойствам через метод C<AUTOLOAD>. Имена свойств должны начинаться со строчной буквы. -=back - =cut \ No newline at end of file
--- a/Lib/IMPL/Web/View/TTDocument.pm Thu Mar 21 16:00:09 2013 +0400 +++ b/Lib/IMPL/Web/View/TTDocument.pm Fri Mar 22 01:05:11 2013 +0400 @@ -17,7 +17,7 @@ 'IMPL::Web::View::TTControl' => sub { my ($template,$ctx) = @_; $ctx ||= Template::Context->new(); - return 'document', $template, $ctx; # context + return $template, $ctx; # context } ], props => [ @@ -29,15 +29,11 @@ sub CTOR { my ($this,$template,$ctx,$loader,$vars) = @_; - $this->controls({}); $this->loader($loader) if $loader; - $this->layout( $template->layout ) unless $this->layout; $this->context->stash->update($vars) if ref $vars eq 'HASH'; - - $this->InitInstance(); } sub Render {
--- a/Lib/IMPL/Web/View/TTFactory.pm Thu Mar 21 16:00:09 2013 +0400 +++ b/Lib/IMPL/Web/View/TTFactory.pm Fri Mar 22 01:05:11 2013 +0400 @@ -15,67 +15,56 @@ }, base => [ 'IMPL::Object::Factory' => sub { - shift->class || 'IMPL::Web::View::TTControl' + shift; } ], props => [ template => PROP_RW, context => PROP_RW, instances => PROP_RW, - base => PROP_RW, + baseLocation => PROP_RW, require => PROP_RO ] }; sub CTOR { - my ($this,$template,$context,$base,$require) = @_; + my ($this,$class,$template,$context,$baseLocation,$require) = @_; die IMPL::ArgumentException("A template is required") unless $template; - Loader->safe->Require($this->factory) - if $this->factory and not ref $this->factory; + Loader->safe->Require($class) + if $class and not ref $class; $context ||= new Template::Context(); $this->template($template); $this->context($context); - $this->base($base); + $this->baseLocation($baseLocation); $this->instances(0); $this->require($require); } sub MergeParameters { - my ($this,$name,$refProps) = @_; - - if (ref $name) { - $refProps = $name; - $name = (ref $refProps eq 'HASH' and ($refProps->{name} || $refProps->{id})) || '*anonymous*'; - } + my ($this,$refProps) = @_; $refProps->{factory} = $this; - my $base = $this->base; - - $this->context->localise(); + my $baseLocation = $this->baseLocation; - my $ctx = _clone_context($this->context); + my $ctx = $this->CloneContext(); - $this->context->delocalise(); - - my $stash = $ctx->stash; my $require = $this->require; - - $stash->update({ + $ctx->stash->update({ require => sub { my ($module) = @_; - $module =~ s/^\.\//$base\//; + $module =~ s/^\.\//$baseLocation\//; return $require->($module); } }); - return ($name, $this->template, $ctx, $refProps); + return ($this->template, $ctx, $refProps); } sub CreateObject { @@ -102,10 +91,16 @@ return $instance; } -sub _clone_context { - my $args = { %{shift || {}} }; +sub CloneContext { + my ($this) = @_; + + $this->context->localise(); + + my $args = { %{$this->context} }; delete $args->{CONFIG}; + $this->context->delocalise(); + return Template::Context->new($args); }