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