Mercurial > pub > Impl
comparison lib/IMPL/Web/View/TTView.pm @ 407:c6e90e02dd17 ref20150831
renamed Lib->lib
| author | cin |
|---|---|
| date | Fri, 04 Sep 2015 19:40:23 +0300 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 406:f23fcb19d3c1 | 407:c6e90e02dd17 |
|---|---|
| 1 package IMPL::Web::View::TTView; | |
| 2 use strict; | |
| 3 | |
| 4 use JSON; | |
| 5 use IMPL::lang qw(hashMerge is); | |
| 6 use IMPL::Const qw(:prop); | |
| 7 use IMPL::declare { | |
| 8 require => { | |
| 9 Context => 'IMPL::Web::View::TTContext', | |
| 10 Loader => 'IMPL::Code::Loader', | |
| 11 Factory => 'IMPL::Web::View::ObjectFactory' | |
| 12 }, | |
| 13 base => [ | |
| 14 'IMPL::Object' => undef, | |
| 15 'IMPL::Object::Autofill' => '@_', | |
| 16 'IMPL::Object::Serializable' => undef | |
| 17 ], | |
| 18 props => [ | |
| 19 options => PROP_RW, | |
| 20 viewBase => PROP_RW, | |
| 21 layoutBase => PROP_RW, | |
| 22 layout => PROP_RW, | |
| 23 tt_ext => PROP_RW, | |
| 24 includes => PROP_RW | PROP_LIST, | |
| 25 globals => PROP_RW | |
| 26 ] | |
| 27 }; | |
| 28 | |
| 29 sub CTOR { | |
| 30 my ($this) = @_; | |
| 31 | |
| 32 $this->tt_ext('tt') unless defined $this->tt_ext; | |
| 33 } | |
| 34 | |
| 35 sub display { | |
| 36 my ($this,$model,$template,$args) = @_; | |
| 37 | |
| 38 my $context = Context->new($this->options); | |
| 39 eval { | |
| 40 $context->process('globals' . '.' . $this->tt_ext, $args); | |
| 41 }; | |
| 42 my $layout = delete $args->{layout} || $this->layout; | |
| 43 | |
| 44 return $context->invoke_environment( | |
| 45 sub { | |
| 46 my $ctx = shift; | |
| 47 if ($layout) { | |
| 48 return $ctx->invoke_environment( | |
| 49 sub { | |
| 50 return shift->render( | |
| 51 $layout, | |
| 52 hashMerge( | |
| 53 { | |
| 54 content => sub { | |
| 55 $ctx->invoke_environment( | |
| 56 sub { | |
| 57 return shift->display_model($model,$template); | |
| 58 }, | |
| 59 { | |
| 60 base => $this->viewBase | |
| 61 } | |
| 62 ) | |
| 63 }, | |
| 64 model => $model | |
| 65 } | |
| 66 ) | |
| 67 ); # render | |
| 68 }, | |
| 69 { | |
| 70 base => $this->layoutBase, | |
| 71 } | |
| 72 ); | |
| 73 } else { | |
| 74 return $ctx->invoke_environment( | |
| 75 sub { | |
| 76 return shift->display_model($model,$template); | |
| 77 }, | |
| 78 { | |
| 79 base => $this->viewBase | |
| 80 } | |
| 81 ); | |
| 82 } | |
| 83 },hashMerge( | |
| 84 $this->globals, | |
| 85 hashMerge( | |
| 86 $args, | |
| 87 { | |
| 88 includes => scalar($this->includes), | |
| 89 tt_ext => $this->tt_ext, | |
| 90 debug => sub { | |
| 91 warn @_; | |
| 92 }, | |
| 93 is => sub { | |
| 94 my ($obj,$class) = @_; | |
| 95 if (is($class,Factory)) { | |
| 96 return is($obj,$class->factory); | |
| 97 } else { | |
| 98 return is($obj,$class); | |
| 99 } | |
| 100 }, | |
| 101 import => sub { | |
| 102 return Factory->new(Loader->safe->Require(shift)); | |
| 103 }, | |
| 104 toJSON => sub { | |
| 105 return JSON->new()->utf8->pretty->encode(shift); | |
| 106 } | |
| 107 } | |
| 108 ) | |
| 109 ) | |
| 110 ); | |
| 111 } | |
| 112 | |
| 113 1; |
