comparison Lib/IMPL/DOM/Transform/ObjectToDOM.pm @ 263:0f59b2de72af

*fixed IMPL::DOM::Schema circular module references *modified IMPL::Object::Singleton, added auto-activation *code cleanups, docs
author sergey
date Wed, 09 Jan 2013 05:17:44 +0400
parents 299af584c05f
children c9c2ec29793f
comparison
equal deleted inserted replaced
262:4ac39b9e2ca4 263:0f59b2de72af
47 ) 47 )
48 ); 48 );
49 $this->_schema($docSchema); 49 $this->_schema($docSchema);
50 50
51 $this->_navi->NavigateCreate($docName); 51 $this->_navi->NavigateCreate($docName);
52 $this->currentNode->nodeProperty(schemaDocument => $docSchema);
52 } 53 }
53 54
54 sub TransformPlain { 55 sub TransformPlain {
55 my ($this,$data) = @_; 56 my ($this,$data) = @_;
56 57
164 165
165 =pod 166 =pod
166 167
167 =head1 NAME 168 =head1 NAME
168 169
169 C<IMPL::DOM::Transform::ObjectToDOM> -преобразование объекта 170 C<IMPL::DOM::Transform::ObjectToDOM> -преобразование объекта в DOM документ.
170 171
171 =head1 SYNOPSIS 172 =head1 SYNOPSIS
172 173
174 =begin code
175
176 use IMPL::require {
177 Schema => 'IMPL::DOM::Schema',
178 Config => 'IMPL::Config'
179 }
180
181 my $data = {
182 id => '12313-232',
183 name => 'Peter',
184 age => 20
185 };
186
187 my $schema = Schema->LoadSchema(Config->AppBase('schemas','person.xml'));
188 my $transorm = IMPL::DOM::Transform::ObjectToDOM->new('edit', $schema);
189
190 my $form = $transform->Transform($data);
191
192 my @errors;
193
194 push @errors, $transform->buildErrors;
195 push @errors, $schema->Validate($doc);
196
197 =end code
198
199 =head1 DESCRIPTION
200
201 Наследует C<IMPL::Transform>. Определяет базовые преобразования для хешей и
202 объектов, поддерживающих метаданные.
203
204 Результатом выполнения преобразования является DOM документ. При построении
205 документа используется навигатор C<IMPL::DOM::Navigator::Builder> для
206 сопоставления схемы и свойств преобразуемого объекта. Элементы полученного
207 документа имеют ссылки на соответствующие им элементы схемы.
208
209 После того, как документ построен и преобразование будет очищено, не останется
210 объектов, которые бы ссылались на документ со схемой, поскольку элементы схемы
211 имеют слабые ссылки на саму схему и не могут предотвратить ее удаление.
212 Для предотвращения очитски документа схемы, ссылка на него сохраняется в
213 атрибуте документа C<schemaDocument>, что обеспечит жизнь схемы на протяжении
214 жизни документа.
215
216 Преобразование происходит рекурсивно, сначала используется метод
217 C<NavigateCreate> для создания элемента соответсвующего свойству объекта,
218 затем вызывается метод C<Transform> для преобразования значения свойства, при
219 этом C<currentNode> указывает на только что созданный элемент документа.
220
221 =head1 MEMBERS
222
223 =head2 C<CTOR($docName,$schema)>
224
225 Создает преобразование, при этом будет создан документ состоящий только из
226 корневого элемента с именем C<$docName> и будет найдена подходящий для него
227 элемент схемы C<$schema>.
228
229 =over
230
231 =item * C<$docName>
232
233 Имя корневого узла документа, которое будет использовано для поиска
234 соответствующего элемента схемы C<$schema>
235
236 =item * C<$schema>
237
238 Схема, содержащая описание документа. Если в данной схеме нет описания корневого
239 элемента с именем C<$docName>, будет вызвано исключение.
240
241 =back
242
243 =head2 C<[get]documentSchema>
244
245 Элемент схемы C<ComplexNode> соответствующий документу. Определяется в
246 конструкторе исходя из имени документа.
247
248 =head2 C<[get]currentNode>
249
250 Текущий элемент документа. После создания преобразования - это сам документ.
251 Данное свойство использется внутри преобразования для работы с текущим
252 элементом.
253
254 =head2 C<[virtual]StoreObject($node,$data)>
255
256 Метод, который вызывается преобразованием в случае если текущий узел документа
257 является простым, а значени которое ему соответсвует является объектом (ссылкой).
258
259 По-умолчанию будет выполнено присваивание C<< $node->nodeValue($data) >>, однако
260 это можно заменить, например, на преобразование в строку.
261
262 =head2 C<inflateNodeValue($data)>
263
264 Метод который используется для преобразования значений к правильным типам,
265 используя атрибут C<inflator> элемента схемы. Этот метод можно использовать для
266 C<TransformPlain>, однако по-умолчанию он не используется, поскольку
267 предполагается, что входной объект имеет уже преобразованные значения в своих
268 свойствах.
269
173 =cut 270 =cut