comparison Lib/IMPL/Web/View/TTControl.pm @ 194:4d0e1962161c

Replaced tabs with spaces IMPL::Web::View - fixed document model, new features (control classes, document constructor parameters)
author cin
date Tue, 10 Apr 2012 20:08:29 +0400
parents a9faf883cdce
children 292226770180
comparison
equal deleted inserted replaced
193:8e8401c0aea4 194:4d0e1962161c
6 6
7 use Template::Context(); 7 use Template::Context();
8 use Scalar::Util qw(weaken); 8 use Scalar::Util qw(weaken);
9 9
10 use parent qw( 10 use parent qw(
11 IMPL::DOM::Node 11 IMPL::DOM::Node
12 ); 12 );
13 13
14 { 14 {
15 my $nextId = 1; 15 my $nextId = 1;
16 sub _GetNextId { 16 sub _GetNextId {
17 return $nextId++; 17 return $nextId++;
18 } 18 }
19 } 19 }
20 20
21 21
22 BEGIN { 22 BEGIN {
23 public _dom property id => PROP_ALL; 23 public _dom property id => PROP_ALL;
24 24
25 public property context => PROP_GET | PROP_OWNERSET; 25 public property context => PROP_GET | PROP_OWNERSET;
26 public property template => PROP_ALL; 26 public property template => PROP_ALL;
27 } 27 }
28 28
29 29
30 sub CTOR { 30 sub CTOR {
31 my ($this,$name,$template,$context,$refProps) = @_; 31 my ($this,$name,$template,$context,$refProps) = @_;
32 32
33 $name ||= "control"; 33 $name ||= "control";
34 34
35 $this->template( $template ) or die new IMPL::ArgumentException("A template is required"); 35 $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"); 36 $this->context( $context ) or die new IMPL::ArgumentException("A context is required");
37 37
38 $this->id($name . "-" . _GetNextId()) unless $this->id; 38 $this->id($name . "-" . _GetNextId()) unless $this->id;
39 39
40 weaken($this); # prevent cyclic references produces by the code below 40 weaken($this); # prevent cyclic references produces by the code below
41 41
42 $context->stash->set('append', sub { $this->appendChild(@_); undef; } ); 42 $context->stash->set('append', sub { $this->appendChild(@_); undef; } );
43 $context->stash->set('select', sub { $this->selectNodes(@_); } ); 43 $context->stash->set('select', sub { $this->selectNodes(@_); } );
44 44
45 } 45 }
46 46
47 our %CTOR = ( 47 our %CTOR = (
48 'IMPL::DOM::Node' => sub { 48 'IMPL::DOM::Node' => sub {
49 nodeName => $_[0], 49 nodeName => $_[0],
50 %{ $_[3] || {} } 50 %{ $_[3] || {} }
51 } 51 }
52 ); 52 );
53 53
54 sub InitInstance { 54 sub InitInstance {
55 my ($this,$args) = @_; 55 my ($this,$args) = @_;
56 56
57 $args ||= {}; 57 $args ||= {};
58 58
59 if ( my $ctor = $this->template->blocks->{CTOR} ) { 59 if ( my $ctor = $this->template->blocks->{CTOR} ) {
60 $this->context->process($ctor, { %$args, this => $this } ); 60 $this->context->include($ctor, { %$args, this => $this } );
61 $this->context->stash->set('this',undef); 61 }
62 }
63 } 62 }
64 63
65 sub renderBlock { 64 sub renderBlock {
66 $_[0]->template->blocks->{RENDER} || $_[0]->template; 65 $_[0]->template->blocks->{RENDER} || $_[0]->template;
67 } 66 }
68 67
69 sub Render { 68 sub Render {
70 my ($this,$args) = @_; 69 my ($this,$args) = @_;
71 70
72 $args = {} unless ref $args eq 'HASH'; 71 $args = {} unless ref $args eq 'HASH';
73 72
74 if(my $body = $this->renderBlock ) { 73 if(my $body = $this->renderBlock ) {
75 return $this->context->include( $body, { %$args, this => $this, template => $this->template, document => $this->document } ); 74 return $this->context->include( $body, { %$args, this => $this, template => $this->template, document => $this->document } );
76 } else { 75 } else {
77 return ""; 76 return "";
78 } 77 }
79 } 78 }
80 79
81 sub AUTOLOAD { 80 sub AUTOLOAD {
82 our $AUTOLOAD; 81 our $AUTOLOAD;
83 82
84 my $method = ($AUTOLOAD =~ m/(\w+)$/)[0]; 83 my $method = ($AUTOLOAD =~ m/(\w+)$/)[0];
85 84
86 return if $method eq 'DESTROY'; 85 return if $method eq 'DESTROY';
87 86
88 my $this = shift; 87 my $this = shift;
89 88
90 $this->nodeProperty($method,@_); 89 $this->nodeProperty($method,@_);
91 } 90 }
92 91
93 1; 92 1;
94 93
95 __END__ 94 __END__