diff Lib/IMPL/Object/Factory.pm @ 64:259cd3df6e53

Doc generation Minor fixes
author wizard
date Mon, 15 Mar 2010 17:45:13 +0300
parents
children 9f5795a10939
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Lib/IMPL/Object/Factory.pm	Mon Mar 15 17:45:13 2010 +0300
@@ -0,0 +1,124 @@
+package IMPL::Object::Factory;
+use strict;
+
+use base qw(IMPL::Object IMPL::Object::Serializable);
+
+use IMPL::Class::Property;
+
+BEGIN {
+	public property factory => prop_get | owner_set;
+	public property parameters => prop_get | owner_set; 
+}
+
+# custom factory, overrides default
+sub new {
+	my $self = shift;
+	
+	return ref $self ? $self->CreateObject(@_) : $self->SUPER::new(@_);
+}
+
+sub CTOR {
+	my ($this,$factory,$parameters) = @_;
+	
+	$this->factory($factory) or die new IMPL::InvalidArgumentException("The argument 'factory' is mandatory");
+	$this->parameters($parameters) if $parameters;
+}
+
+# override default restore method
+sub restore {
+	my ($class,$data,$surrogate) = @_;
+	
+	my %args = @$data;
+	
+	if ($surrogate) {
+		$surrogate->callCTOR($args{factory},$args{parameters});
+		return $surrogate;
+	} else {
+		return $class->new($args{factory},$args{parameters});
+	}
+}
+
+sub CreateObject {
+	my $this = shift;
+	
+	return $this->factory->new($this->parameters ? (_as_list($this->parameters),@_) : @_);
+}
+
+sub _as_list {
+	ref $_[0] ?
+		(ref $_[0] eq 'HASH' ?
+			%{$_[0]}
+			:
+			(ref $_[0] eq 'ARRAY'?
+				@{$_[0]}
+				:
+				$_[0]
+			)
+		)
+		:
+		($_[0]);
+}
+
+
+1;
+
+__END__
+
+=pod
+
+=head1 SYNOPSIS
+
+=begin code
+
+sub ProcessItems {
+	my ($factory,$items);
+	
+	return map $factory->new($_), @$items;
+}
+
+my @users = ProcessItems('MyApp::User',$db->selectUsers);
+
+my $factory = new IMPL::Object::Factory(
+	'MyApp::User',
+	{
+		isAdmin => 1
+	}
+);
+
+=end code
+
+my @admins = ProcessItems($factory,$db->selectAdmins);
+
+
+=head1 DESCRIPTION
+
+Класс, реализующий фабрику классов.
+
+Фабрика классов это любой объект, который имеет метод C< new > вызов которого приводит к созданию нового
+объекта. Например каждый класс сам явялется фабрикой, поскольку, если у него вызвать метод
+C< new >, то будет создан объект. Полученные объекты, в силу механизмов языка Perl, также
+являются фабриками, притом такимиже, что и класс.
+
+Данный класс меняет поведение метода C< new > в зависимости от контекста вызова: статического
+метода или метода объекта. При вызове метода C< new > у класса происходит создание объекта
+фабрики с определенными параметрами. Далее объект-фабрика может быть использована для создания
+объектов уже на основе параметров фабрики.
+
+=head1 MEMBERS
+
+=over
+
+=item C< factory >
+
+Свойство, содержащее фабрику для создание новых объектов текущей фабрикой. Чаще всего оно содержит
+имя класса.
+
+=item C< parameters >
+
+Свойство, содержит ссылку на параметры для создания объектов, при создании объекта эти параметры будут
+развернуты в список и переданы оператору C< new > фабрике из свойства C< factory >, за ними будут
+следовать параметры непосредственно текущей фабрики. 
+
+=back
+
+=cut
\ No newline at end of file