Mercurial > pub > Impl
comparison 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 |
comparison
equal
deleted
inserted
replaced
63:76b878ad6596 | 64:259cd3df6e53 |
---|---|
1 package IMPL::Object::Factory; | |
2 use strict; | |
3 | |
4 use base qw(IMPL::Object IMPL::Object::Serializable); | |
5 | |
6 use IMPL::Class::Property; | |
7 | |
8 BEGIN { | |
9 public property factory => prop_get | owner_set; | |
10 public property parameters => prop_get | owner_set; | |
11 } | |
12 | |
13 # custom factory, overrides default | |
14 sub new { | |
15 my $self = shift; | |
16 | |
17 return ref $self ? $self->CreateObject(@_) : $self->SUPER::new(@_); | |
18 } | |
19 | |
20 sub CTOR { | |
21 my ($this,$factory,$parameters) = @_; | |
22 | |
23 $this->factory($factory) or die new IMPL::InvalidArgumentException("The argument 'factory' is mandatory"); | |
24 $this->parameters($parameters) if $parameters; | |
25 } | |
26 | |
27 # override default restore method | |
28 sub restore { | |
29 my ($class,$data,$surrogate) = @_; | |
30 | |
31 my %args = @$data; | |
32 | |
33 if ($surrogate) { | |
34 $surrogate->callCTOR($args{factory},$args{parameters}); | |
35 return $surrogate; | |
36 } else { | |
37 return $class->new($args{factory},$args{parameters}); | |
38 } | |
39 } | |
40 | |
41 sub CreateObject { | |
42 my $this = shift; | |
43 | |
44 return $this->factory->new($this->parameters ? (_as_list($this->parameters),@_) : @_); | |
45 } | |
46 | |
47 sub _as_list { | |
48 ref $_[0] ? | |
49 (ref $_[0] eq 'HASH' ? | |
50 %{$_[0]} | |
51 : | |
52 (ref $_[0] eq 'ARRAY'? | |
53 @{$_[0]} | |
54 : | |
55 $_[0] | |
56 ) | |
57 ) | |
58 : | |
59 ($_[0]); | |
60 } | |
61 | |
62 | |
63 1; | |
64 | |
65 __END__ | |
66 | |
67 =pod | |
68 | |
69 =head1 SYNOPSIS | |
70 | |
71 =begin code | |
72 | |
73 sub ProcessItems { | |
74 my ($factory,$items); | |
75 | |
76 return map $factory->new($_), @$items; | |
77 } | |
78 | |
79 my @users = ProcessItems('MyApp::User',$db->selectUsers); | |
80 | |
81 my $factory = new IMPL::Object::Factory( | |
82 'MyApp::User', | |
83 { | |
84 isAdmin => 1 | |
85 } | |
86 ); | |
87 | |
88 =end code | |
89 | |
90 my @admins = ProcessItems($factory,$db->selectAdmins); | |
91 | |
92 | |
93 =head1 DESCRIPTION | |
94 | |
95 Класс, реализующий фабрику классов. | |
96 | |
97 Фабрика классов это любой объект, который имеет метод C< new > вызов которого приводит к созданию нового | |
98 объекта. Например каждый класс сам явялется фабрикой, поскольку, если у него вызвать метод | |
99 C< new >, то будет создан объект. Полученные объекты, в силу механизмов языка Perl, также | |
100 являются фабриками, притом такимиже, что и класс. | |
101 | |
102 Данный класс меняет поведение метода C< new > в зависимости от контекста вызова: статического | |
103 метода или метода объекта. При вызове метода C< new > у класса происходит создание объекта | |
104 фабрики с определенными параметрами. Далее объект-фабрика может быть использована для создания | |
105 объектов уже на основе параметров фабрики. | |
106 | |
107 =head1 MEMBERS | |
108 | |
109 =over | |
110 | |
111 =item C< factory > | |
112 | |
113 Свойство, содержащее фабрику для создание новых объектов текущей фабрикой. Чаще всего оно содержит | |
114 имя класса. | |
115 | |
116 =item C< parameters > | |
117 | |
118 Свойство, содержит ссылку на параметры для создания объектов, при создании объекта эти параметры будут | |
119 развернуты в список и переданы оператору C< new > фабрике из свойства C< factory >, за ними будут | |
120 следовать параметры непосредственно текущей фабрики. | |
121 | |
122 =back | |
123 | |
124 =cut |