comparison Lib/IMPL/Web/View/TTFactory.pm @ 300:bf3af33b9003

sync
author cin
date Fri, 22 Mar 2013 01:05:11 +0400
parents 78f767765706
children aeeb57a12046
comparison
equal deleted inserted replaced
299:bd79145657e5 300:bf3af33b9003
13 require => { 13 require => {
14 Loader => 'IMPL::Code::Loader' 14 Loader => 'IMPL::Code::Loader'
15 }, 15 },
16 base => [ 16 base => [
17 'IMPL::Object::Factory' => sub { 17 'IMPL::Object::Factory' => sub {
18 shift->class || 'IMPL::Web::View::TTControl' 18 shift;
19 } 19 }
20 ], 20 ],
21 props => [ 21 props => [
22 template => PROP_RW, 22 template => PROP_RW,
23 context => PROP_RW, 23 context => PROP_RW,
24 instances => PROP_RW, 24 instances => PROP_RW,
25 base => PROP_RW, 25 baseLocation => PROP_RW,
26 require => PROP_RO 26 require => PROP_RO
27 ] 27 ]
28 }; 28 };
29 29
30 sub CTOR { 30 sub CTOR {
31 my ($this,$template,$context,$base,$require) = @_; 31 my ($this,$class,$template,$context,$baseLocation,$require) = @_;
32 32
33 die IMPL::ArgumentException("A template is required") unless $template; 33 die IMPL::ArgumentException("A template is required") unless $template;
34 34
35 Loader->safe->Require($this->factory) 35 Loader->safe->Require($class)
36 if $this->factory and not ref $this->factory; 36 if $class and not ref $class;
37 37
38 $context ||= new Template::Context(); 38 $context ||= new Template::Context();
39 39
40 $this->template($template); 40 $this->template($template);
41 $this->context($context); 41 $this->context($context);
42 $this->base($base); 42 $this->baseLocation($baseLocation);
43 $this->instances(0); 43 $this->instances(0);
44 $this->require($require); 44 $this->require($require);
45 } 45 }
46 46
47 sub MergeParameters { 47 sub MergeParameters {
48 my ($this,$name,$refProps) = @_; 48 my ($this,$refProps) = @_;
49
50 if (ref $name) {
51 $refProps = $name;
52 $name = (ref $refProps eq 'HASH' and ($refProps->{name} || $refProps->{id})) || '*anonymous*';
53 }
54 49
55 $refProps->{factory} = $this; 50 $refProps->{factory} = $this;
56 51
57 my $base = $this->base; 52 my $baseLocation = $this->baseLocation;
58 53
59 $this->context->localise(); 54 my $ctx = $this->CloneContext();
60 55
61 my $ctx = _clone_context($this->context);
62
63 $this->context->delocalise();
64
65 my $stash = $ctx->stash;
66 my $require = $this->require; 56 my $require = $this->require;
67 57
68 58 $ctx->stash->update({
69 $stash->update({
70 require => sub { 59 require => sub {
71 my ($module) = @_; 60 my ($module) = @_;
72 61
73 $module =~ s/^\.\//$base\//; 62 $module =~ s/^\.\//$baseLocation\//;
74 return $require->($module); 63 return $require->($module);
75 } 64 }
76 }); 65 });
77 66
78 return ($name, $this->template, $ctx, $refProps); 67 return ($this->template, $ctx, $refProps);
79 } 68 }
80 69
81 sub CreateObject { 70 sub CreateObject {
82 my $this = shift; 71 my $this = shift;
83 72
100 $this->instances($count); 89 $this->instances($count);
101 90
102 return $instance; 91 return $instance;
103 } 92 }
104 93
105 sub _clone_context { 94 sub CloneContext {
106 my $args = { %{shift || {}} }; 95 my ($this) = @_;
96
97 $this->context->localise();
98
99 my $args = { %{$this->context} };
107 delete $args->{CONFIG}; 100 delete $args->{CONFIG};
101
102 $this->context->delocalise();
108 103
109 return Template::Context->new($args); 104 return Template::Context->new($args);
110 } 105 }
111 106
112 sub save { 107 sub save {