Mercurial > pub > Impl
comparison Lib/IMPL/Object/Factory.pm @ 73:2f31ecabe9ea
doc
security
author | wizard |
---|---|
date | Mon, 29 Mar 2010 06:56:05 +0400 |
parents | 9f5795a10939 |
children | 9cb8e730fa86 |
comparison
equal
deleted
inserted
replaced
72:eac47fa4f262 | 73:2f31ecabe9ea |
---|---|
5 | 5 |
6 use IMPL::Class::Property; | 6 use IMPL::Class::Property; |
7 | 7 |
8 BEGIN { | 8 BEGIN { |
9 public property factory => prop_get | owner_set; | 9 public property factory => prop_get | owner_set; |
10 public property parameters => prop_get | owner_set; | 10 public property parameters => prop_get | owner_set; |
11 public property method => prop_get | owner_set; | |
11 } | 12 } |
12 | 13 |
13 # custom factory, overrides default | 14 # custom factory, overrides default |
14 sub new { | 15 sub new { |
15 my $self = shift; | 16 my $self = shift; |
16 | 17 |
17 return ref $self ? $self->CreateObject(@_) : $self->SUPER::new(@_); | 18 return ref $self ? $self->CreateObject(@_) : $self->SUPER::new(@_); |
18 } | 19 } |
19 | 20 |
20 sub CTOR { | 21 sub CTOR { |
21 my ($this,$factory,$parameters) = @_; | 22 my ($this,$factory,$parameters,$method) = @_; |
22 | 23 |
23 $this->factory($factory) or die new IMPL::InvalidArgumentException("The argument 'factory' is mandatory"); | 24 $this->factory($factory) or die new IMPL::InvalidArgumentException("The argument 'factory' is mandatory"); |
24 $this->parameters($parameters) if $parameters; | 25 $this->parameters($parameters) if $parameters; |
26 $this->method($method) if $method; | |
25 } | 27 } |
26 | 28 |
27 # override default restore method | 29 # override default restore method |
28 sub restore { | 30 sub restore { |
29 my ($class,$data,$surrogate) = @_; | 31 my ($class,$data,$surrogate) = @_; |
39 } | 41 } |
40 | 42 |
41 sub CreateObject { | 43 sub CreateObject { |
42 my $this = shift; | 44 my $this = shift; |
43 | 45 |
44 return $this->factory->new($this->parameters ? (_as_list($this->parameters),@_) : @_); | 46 if (my $method = $this->method) { |
47 $this->factory->$method($this->parameters ? (_as_list($this->parameters),@_) : @_); | |
48 } else { | |
49 $this->factory->new($this->parameters ? (_as_list($this->parameters),@_) : @_); | |
50 } | |
45 } | 51 } |
46 | 52 |
47 sub _as_list { | 53 sub _as_list { |
48 ref $_[0] ? | 54 ref $_[0] ? |
49 (ref $_[0] eq 'HASH' ? | 55 (ref $_[0] eq 'HASH' ? |
120 | 126 |
121 =head1 MEMBERS | 127 =head1 MEMBERS |
122 | 128 |
123 =over | 129 =over |
124 | 130 |
125 =item C< CTOR($factory,$parameters) > | 131 =item C< CTOR($factory,$parameters,$method) > |
126 | 132 |
127 Создает новый экземпляр | 133 Создает новый экземпляр фабрики. |
128 | 134 |
129 =over | 135 =over |
130 | 136 |
131 =item C<$factory> | 137 =item C<$factory> |
132 | 138 |
142 Если является ссылкой на массив, то при создании объектов данной фабрикой этот массив | 148 Если является ссылкой на массив, то при создании объектов данной фабрикой этот массив |
143 будет передан в списк и передан параметрами методу C<new>. | 149 будет передан в списк и передан параметрами методу C<new>. |
144 | 150 |
145 Если является любым другим объектом или скаляром, то будет передан параметром методу | 151 Если является любым другим объектом или скаляром, то будет передан параметром методу |
146 C<new> как есть. | 152 C<new> как есть. |
153 | |
154 =item C<$method> | |
155 | |
156 Имя метода (или ссылка на процедуру), который будет вызван у C<$factory> при создании | |
157 текущей фабрикой нового объекта. | |
147 | 158 |
148 =back | 159 =back |
149 | 160 |
150 =item C< [get] factory > | 161 =item C< [get] factory > |
151 | 162 |
166 =begin code | 177 =begin code |
167 | 178 |
168 sub new { | 179 sub new { |
169 my ($this,@params) = @_; | 180 my ($this,@params) = @_; |
170 | 181 |
171 return $this->factory->new(_as_list($this->parameters), @params); | 182 my $method = $this->method || 'new'; |
183 | |
184 return $this->factory->$method(_as_list($this->parameters), @params); | |
172 } | 185 } |
173 | 186 |
174 =end code | 187 =end code |
175 | 188 |
176 =back | 189 =back |