Mercurial > pub > Impl
diff Lib/IMPL/Object/Factory.pm @ 73:2f31ecabe9ea
doc
security
author | wizard |
---|---|
date | Mon, 29 Mar 2010 06:56:05 +0400 |
parents | 9f5795a10939 |
children | 9cb8e730fa86 |
line wrap: on
line diff
--- a/Lib/IMPL/Object/Factory.pm Fri Mar 26 16:26:31 2010 +0300 +++ b/Lib/IMPL/Object/Factory.pm Mon Mar 29 06:56:05 2010 +0400 @@ -7,7 +7,8 @@ BEGIN { public property factory => prop_get | owner_set; - public property parameters => prop_get | owner_set; + public property parameters => prop_get | owner_set; + public property method => prop_get | owner_set; } # custom factory, overrides default @@ -18,10 +19,11 @@ } sub CTOR { - my ($this,$factory,$parameters) = @_; + my ($this,$factory,$parameters,$method) = @_; $this->factory($factory) or die new IMPL::InvalidArgumentException("The argument 'factory' is mandatory"); $this->parameters($parameters) if $parameters; + $this->method($method) if $method; } # override default restore method @@ -41,7 +43,11 @@ sub CreateObject { my $this = shift; - return $this->factory->new($this->parameters ? (_as_list($this->parameters),@_) : @_); + if (my $method = $this->method) { + $this->factory->$method($this->parameters ? (_as_list($this->parameters),@_) : @_); + } else { + $this->factory->new($this->parameters ? (_as_list($this->parameters),@_) : @_); + } } sub _as_list { @@ -122,9 +128,9 @@ =over -=item C< CTOR($factory,$parameters) > +=item C< CTOR($factory,$parameters,$method) > -Создает новый экземпляр +Создает новый экземпляр фабрики. =over @@ -145,6 +151,11 @@ Если является любым другим объектом или скаляром, то будет передан параметром методу C<new> как есть. +=item C<$method> + +Имя метода (или ссылка на процедуру), который будет вызван у C<$factory> при создании +текущей фабрикой нового объекта. + =back =item C< [get] factory > @@ -168,7 +179,9 @@ sub new { my ($this,@params) = @_; - return $this->factory->new(_as_list($this->parameters), @params); + my $method = $this->method || 'new'; + + return $this->factory->$method(_as_list($this->parameters), @params); } =end code