view lib/IMPL/Web/View/TTView.pm @ 412:30e8c6a74937 ref20150831

working on di container (role based registrations)
author cin
date Mon, 21 Sep 2015 19:54:10 +0300
parents c6e90e02dd17
children
line wrap: on
line source

package IMPL::Web::View::TTView;
use strict;

use JSON;
use IMPL::lang qw(hashMerge is);
use IMPL::Const qw(:prop);
use IMPL::declare {
	require => {
		Context => 'IMPL::Web::View::TTContext',
		Loader  => 'IMPL::Code::Loader',
		Factory => 'IMPL::Web::View::ObjectFactory'
	},
	base => [
		'IMPL::Object' => undef,
		'IMPL::Object::Autofill' => '@_',
		'IMPL::Object::Serializable' => undef
	],
	props => [
		options => PROP_RW,
		viewBase => PROP_RW,
		layoutBase => PROP_RW,
		layout => PROP_RW,
		tt_ext => PROP_RW,
		includes => PROP_RW | PROP_LIST,
		globals => PROP_RW
	]
};

sub CTOR {
	my ($this) = @_;
	
	$this->tt_ext('tt') unless defined $this->tt_ext;
}

sub display {
	my ($this,$model,$template,$args) = @_;
	
	my $context = Context->new($this->options);
	eval {
		$context->process('globals' . '.' . $this->tt_ext, $args);
	};
	my $layout = delete $args->{layout} || $this->layout;
	
	return $context->invoke_environment(
		sub {
			my $ctx = shift;
			if ($layout) {
				return $ctx->invoke_environment(
					sub {
						return shift->render(
							$layout,
							hashMerge(
								{
									content => sub {
										$ctx->invoke_environment(
											sub {
												return shift->display_model($model,$template);
											},
											{
												base => $this->viewBase
											}
										)
									},
									model => $model
								}
							)
						); # render
					},
					{
						base => $this->layoutBase,
					}
				);
			} else {
				return $ctx->invoke_environment(
					sub {
						return shift->display_model($model,$template);
					},
					{
						base => $this->viewBase
					}
				);
			}
		},hashMerge(
			$this->globals,
			hashMerge(
				$args,
				{
					includes => scalar($this->includes),
					tt_ext => $this->tt_ext,
					debug => sub {
						warn @_;
					},
					is => sub {
						my ($obj,$class) = @_;
						if (is($class,Factory)) {
							return is($obj,$class->factory);
						} else {
							return is($obj,$class);
						}
					},
					import => sub {
						return Factory->new(Loader->safe->Require(shift));
					},
					toJSON => sub {
						return JSON->new()->utf8->pretty->encode(shift);
					}
				}
			)
		)
	);
}

1;