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