407
|
1 package IMPL::Web::View::TTControl;
|
|
2 use strict;
|
|
3
|
|
4 use IMPL::Const qw(:prop);
|
|
5 use IMPL::lang qw(:hash :base);
|
|
6 use IMPL::declare {
|
|
7 require => {
|
|
8 Exception => 'IMPL::Exception',
|
|
9 ArgException => '-IMPL::InvalidArgumentException'
|
|
10 },
|
|
11 base => [
|
|
12 'IMPL::Object' => undef
|
|
13 ],
|
|
14 props => [
|
|
15 context => PROP_RO,
|
|
16 template => PROP_RO
|
|
17 ]
|
|
18 };
|
|
19
|
|
20 our $AUTOLOAD_REGEX = qr/^[a-z]/;
|
|
21
|
|
22 sub CTOR {
|
|
23 my ($this,$context,$template,$args) = @_;
|
|
24
|
|
25 $this->context($context)
|
|
26 or die ArgException->new(context => 'A context is required');
|
|
27 $this->template($template)
|
|
28 or die ArgException->new(template => 'A template is required');
|
|
29
|
|
30 if (ref $args eq 'HASH') {
|
|
31 while(my ($key, $value) = each %$args) {
|
|
32 next if grep $_ eq $key, qw(context template);
|
|
33 $this->$key($value);
|
|
34 }
|
|
35 }
|
|
36 }
|
|
37
|
|
38 sub _PopulateMethods {
|
|
39 my ($this,@methods) = @_;
|
|
40
|
|
41 $this->_stash->update({
|
|
42 map {
|
|
43 my $name = $_;
|
|
44 $name,
|
|
45 sub {
|
|
46 $this->$name(@_);
|
|
47 }
|
|
48 } @methods
|
|
49 });
|
|
50 }
|
|
51
|
|
52 sub _stash {
|
|
53 $_[0]->context->stash;
|
|
54 }
|
|
55
|
|
56 sub Render {
|
|
57 my ($this,$args) = @_;
|
|
58 return $this->context->include($this->template,$args);
|
|
59 }
|
|
60
|
|
61 our $AUTOLOAD;
|
|
62 sub AUTOLOAD {
|
|
63 my ($prop) = ($AUTOLOAD =~ m/(\w+)$/);
|
|
64
|
|
65 die Exception->new("Method not found: $AUTOLOAD") unless $prop=~/$AUTOLOAD_REGEX/ and $_[0];
|
|
66
|
|
67 no strict 'refs';
|
|
68
|
|
69 my $method = sub {
|
|
70 my $that = shift;
|
|
71 if (@_ == 0) {
|
|
72 return $that->_stash->get($prop);
|
|
73 } elsif (@_ == 1) {
|
|
74 return $that->_stash->set($prop,shift);
|
|
75 } else {
|
|
76 return $that->_stash->get([$prop,[@_]]);
|
|
77 }
|
|
78 };
|
|
79
|
|
80 *{$AUTOLOAD} = $method;
|
|
81
|
|
82 goto &$method;
|
|
83 }
|
|
84
|
|
85
|
|
86 1;
|
|
87
|
|
88 __END__
|
|
89
|
|
90 =pod
|
|
91
|
|
92 =head1 NAME
|
|
93
|
|
94 C<IMPL::Web::View::TTControl> расширяет функциональность шаблонов
|
|
95
|
|
96 =head1 SYNPOSIS
|
|
97
|
|
98 =begin code
|
|
99
|
|
100 package My::View::Menu;
|
|
101 use IMPL::declare {
|
|
102 base => [
|
|
103 'IMPL::Web::View::TTControl' => '@_'
|
|
104 ]
|
|
105 };
|
|
106
|
|
107 sub Render {
|
|
108 my ($this,$args) = @_;
|
|
109
|
|
110 $this->PrepareItems($args);
|
|
111
|
|
112 return $this->next::method($args);
|
|
113 }
|
|
114
|
|
115 sub PrepareItems
|
|
116
|
|
117 =end code
|
|
118
|
|
119 =head1 DESCRIPTION
|
|
120
|
|
121
|
|
122 =cut |