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 |
