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