Mercurial > pub > Impl
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