Mercurial > pub > Impl
comparison Lib/IMPL/Web/View/TTControl.pm @ 234:2530d1bb9638
sync
| author | sergey |
|---|---|
| date | Thu, 11 Oct 2012 20:11:45 +0400 |
| parents | 5c82eec23bb6 |
| children | 2904da230022 |
comparison
equal
deleted
inserted
replaced
| 233:3cebcf6fdb9b | 234:2530d1bb9638 |
|---|---|
| 1 package IMPL::Web::View::TTControl; | 1 package IMPL::Web::View::TTControl; |
| 2 use strict; | 2 use strict; |
| 3 | 3 |
| 4 use IMPL::DOM::Property qw(_dom); | |
| 5 use IMPL::lang qw(:declare ); | |
| 6 | |
| 7 use Template::Context(); | |
| 8 use Scalar::Util qw(weaken); | 4 use Scalar::Util qw(weaken); |
| 9 | 5 |
| 10 use parent qw( | 6 use IMPL::Const qw(:prop); |
| 11 IMPL::DOM::Node | 7 use IMPL::declare { |
| 12 ); | 8 require => { |
| 9 TTContext => 'Template::Context', | |
| 10 Exception => 'IMPL::Exception', | |
| 11 ArgumentException => '-IMPL::InvalidArgumentException' | |
| 12 }, | |
| 13 base => [ | |
| 14 'IMPL::DOM::Node' => sub { | |
| 15 nodeName => $_[0], | |
| 16 %{ $_[3] || {} } | |
| 17 } | |
| 18 ], | |
| 19 props => [ | |
| 20 id => PROP_RO, | |
| 21 context => PROP_RO, | |
| 22 template => PROP_RO | |
| 23 ] | |
| 24 }; | |
| 25 | |
| 13 | 26 |
| 14 { | 27 { |
| 15 my $nextId = 1; | 28 my $nextId = 1; |
| 16 sub _GetNextId { | 29 sub _GetNextId { |
| 17 return $nextId++; | 30 return $nextId++; |
| 18 } | 31 } |
| 19 } | 32 } |
| 20 | |
| 21 | |
| 22 BEGIN { | |
| 23 public _dom property id => PROP_ALL; | |
| 24 | |
| 25 public property context => PROP_GET | PROP_OWNERSET; | |
| 26 public property template => PROP_ALL; | |
| 27 } | |
| 28 | |
| 29 | 33 |
| 30 sub CTOR { | 34 sub CTOR { |
| 31 my ($this,$name,$template,$context,$refProps) = @_; | 35 my ($this,$name,$template,$context,$refProps) = @_; |
| 32 | 36 |
| 33 $name ||= "control"; | 37 $name ||= "control"; |
| 35 $this->template( $template ) or die new IMPL::ArgumentException("A template is required"); | 39 $this->template( $template ) or die new IMPL::ArgumentException("A template is required"); |
| 36 $this->context( $context ) or die new IMPL::ArgumentException("A context is required"); | 40 $this->context( $context ) or die new IMPL::ArgumentException("A context is required"); |
| 37 | 41 |
| 38 $this->id($name . "-" . _GetNextId()) unless $this->id; | 42 $this->id($name . "-" . _GetNextId()) unless $this->id; |
| 39 | 43 |
| 40 weaken($this); # prevent cyclic references produces by the code below | 44 weaken($this); # prevent cyclic references produced by the code below |
| 41 | 45 |
| 42 $context->stash->set('append', sub { $this->appendChild(@_); undef; } ); | 46 $context->stash->set('append', sub { $this->appendChild(@_); undef; } ); |
| 43 $context->stash->set('select', sub { $this->selectNodes(@_); } ); | 47 $context->stash->set('select', sub { $this->selectNodes(@_); } ); |
| 44 | |
| 45 } | 48 } |
| 46 | |
| 47 our %CTOR = ( | |
| 48 'IMPL::DOM::Node' => sub { | |
| 49 nodeName => $_[0], | |
| 50 %{ $_[3] || {} } | |
| 51 } | |
| 52 ); | |
| 53 | 49 |
| 54 sub InitInstance { | 50 sub InitInstance { |
| 55 my ($this,$args) = @_; | 51 my ($this,$args) = @_; |
| 56 | 52 |
| 57 $args ||= {}; | 53 $args ||= {}; |
| 59 if ( my $ctor = $this->template->blocks->{CTOR} ) { | 55 if ( my $ctor = $this->template->blocks->{CTOR} ) { |
| 60 $this->context->include($ctor, { %$args, this => $this, template => $this->template } ); | 56 $this->context->include($ctor, { %$args, this => $this, template => $this->template } ); |
| 61 } | 57 } |
| 62 } | 58 } |
| 63 | 59 |
| 64 sub renderBlock { | 60 sub GetRenderBlock { |
| 65 $_[0]->template->blocks->{RENDER} || $_[0]->template; | 61 $_[0]->template->blocks->{RENDER} || $_[0]->template; |
| 66 } | 62 } |
| 67 | 63 |
| 68 sub Render { | 64 sub Render { |
| 69 my ($this,$args) = @_; | 65 my ($this,$args) = @_; |
| 70 | 66 |
| 71 $args = {} unless ref $args eq 'HASH'; | 67 $args = {} unless ref $args eq 'HASH'; |
| 72 | 68 |
| 73 if(my $body = $this->renderBlock ) { | 69 if(my $body = $this->GetRenderBlock ) { |
| 74 return $this->context->include( $body, { %$args, this => $this, template => $this->template, document => $this->document } ); | 70 return $this->context->include( $body, { %$args, this => $this, template => $this->template, document => $this->document } ); |
| 75 } else { | 71 } else { |
| 76 return ""; | 72 return ""; |
| 77 } | 73 } |
| 78 } | 74 } |
