Mercurial > pub > Impl
comparison Lib/IMPL/Object/Factory.pm @ 181:47dac58691ee
New templating system, small fixes
author | sourcer |
---|---|
date | Thu, 26 Jan 2012 01:15:57 +0400 |
parents | d1676be8afcc |
children | 6c0fee769b0c |
comparison
equal
deleted
inserted
replaced
180:d1676be8afcc | 181:47dac58691ee |
---|---|
1 package IMPL::Object::Factory; | 1 package IMPL::Object::Factory; |
2 use strict; | 2 use strict; |
3 | 3 |
4 use parent qw(IMPL::Object IMPL::Object::Serializable); | 4 use parent qw(IMPL::Object IMPL::Object::Serializable); |
5 | 5 |
6 use IMPL::Class::Property; | 6 use IMPL::lang qw(:declare :constants); |
7 | 7 |
8 BEGIN { | 8 BEGIN { |
9 public property factory => prop_get | owner_set; | 9 public property factory => PROP_GET | PROP_OWNERSET; |
10 public property parameters => prop_get | owner_set; | 10 public property parameters => PROP_GET | PROP_OWNERSET; |
11 public property method => prop_get | owner_set; | 11 public property method => PROP_GET | PROP_OWNERSET; |
12 } | 12 } |
13 | 13 |
14 # custom factory, overrides default | 14 # custom factory, overrides default |
15 sub new { | 15 sub new { |
16 my $self = shift; | 16 my $self = shift; |
31 my ($class,$data,$surrogate) = @_; | 31 my ($class,$data,$surrogate) = @_; |
32 | 32 |
33 my %args = @$data; | 33 my %args = @$data; |
34 | 34 |
35 if ($surrogate) { | 35 if ($surrogate) { |
36 $surrogate->callCTOR($args{factory},$args{parameters},$args{method}); | 36 $surrogate->self::CTOR($args{factory},$args{parameters},$args{method}); |
37 return $surrogate; | 37 return $surrogate; |
38 } else { | 38 } else { |
39 return $class->new($args{factory},$args{parameters},$args{method}); | 39 return $class->new($args{factory},$args{parameters},$args{method}); |
40 } | 40 } |
41 } | 41 } |
42 | 42 |
43 sub CreateObject { | 43 sub CreateObject { |
44 my $this = shift; | 44 my $this = shift; |
45 | 45 |
46 if (my $method = $this->method) { | 46 if (my $method = $this->method) { |
47 $this->factory->$method($this->parameters ? (_as_list($this->parameters),@_) : @_); | 47 $this->factory->$method($this->MergeParameters(@_)); |
48 } else { | 48 } else { |
49 $this->factory->new($this->parameters ? (_as_list($this->parameters),@_) : @_); | 49 $this->factory->new($this->MergeParemeters(@_)); |
50 } | 50 } |
51 } | 51 } |
52 | |
53 sub MergeParameters { | |
54 my $this = shift; | |
55 | |
56 $this->parameters ? (_as_list($this->parameters),@_) : @_; | |
57 } | |
58 | |
52 | 59 |
53 sub _as_list { | 60 sub _as_list { |
54 ref $_[0] ? | 61 ref $_[0] ? |
55 (ref $_[0] eq 'HASH' ? | 62 (ref $_[0] eq 'HASH' ? |
56 %{$_[0]} | 63 %{$_[0]} |
167 | 174 |
168 Свойство, содержит ссылку на параметры для создания объектов, при создании объекта эти параметры будут | 175 Свойство, содержит ссылку на параметры для создания объектов, при создании объекта эти параметры будут |
169 развернуты в список и переданы оператору C< new > фабрике из свойства C< factory >, за ними будут | 176 развернуты в список и переданы оператору C< new > фабрике из свойства C< factory >, за ними будут |
170 следовать параметры непосредственно текущей фабрики. | 177 следовать параметры непосредственно текущей фабрики. |
171 | 178 |
179 =item C<MergeParameters(@params)> | |
180 | |
181 Метод смешивающий фиксированные параметры с параметрами переданными методу C<new(@params)>. По умолчанию | |
182 добавляет пареметры фабрики в конец к фиксированным параметрам. Для изменения этого поведения требуется | |
183 переопределить данный метод. Также этот метод можно переопределить для передачи параметров, значения | |
184 которых вычисляются. | |
185 | |
172 =item C<new(@params)> | 186 =item C<new(@params)> |
173 | 187 |
174 Создает новый объект, используя свйство C<factory> как фабрику и передавая туда параметры | 188 Создает новый объект, используя свйство C<factory> как фабрику и передавая туда параметры |
175 из свойства C<parameters> и списка C<@params>. Ниже приведен упрощенный пример, как это происходит. | 189 из свойства C<parameters> и списка C<@params>. Ниже приведен упрощенный пример, как это происходит. |
176 | 190 |