diff 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
line wrap: on
line diff
--- a/Lib/IMPL/DOM/Transform/ObjectToDOM.pm	Sat Dec 29 03:22:15 2012 +0400
+++ b/Lib/IMPL/DOM/Transform/ObjectToDOM.pm	Wed Jan 09 05:17:44 2013 +0400
@@ -49,6 +49,7 @@
     $this->_schema($docSchema);
     
     $this->_navi->NavigateCreate($docName);
+    $this->currentNode->nodeProperty(schemaDocument => $docSchema);
 }
 
 sub TransformPlain {
@@ -166,8 +167,104 @@
 
 =head1 NAME
 
-C<IMPL::DOM::Transform::ObjectToDOM> -преобразование объекта  
+C<IMPL::DOM::Transform::ObjectToDOM> -преобразование объекта в DOM документ.
 
 =head1 SYNOPSIS 
 
+=begin code
+
+use IMPL::require {
+    Schema => 'IMPL::DOM::Schema',
+    Config => 'IMPL::Config'
+}
+
+my $data = {
+    id => '12313-232',
+    name => 'Peter',
+    age => 20
+};
+
+my $schema = Schema->LoadSchema(Config->AppBase('schemas','person.xml'));
+my $transorm = IMPL::DOM::Transform::ObjectToDOM->new('edit', $schema);
+
+my $form = $transform->Transform($data);
+
+my @errors;
+    
+push @errors, $transform->buildErrors;
+push @errors, $schema->Validate($doc);
+
+=end code
+
+=head1 DESCRIPTION
+
+Наследует C<IMPL::Transform>. Определяет базовые преобразования для хешей и
+объектов, поддерживающих метаданные.
+
+Результатом выполнения преобразования является DOM документ. При построении
+документа используется навигатор C<IMPL::DOM::Navigator::Builder> для
+сопоставления схемы и свойств преобразуемого объекта. Элементы полученного
+документа имеют ссылки на соответствующие им элементы схемы.
+
+После того, как документ построен и преобразование будет очищено, не останется
+объектов, которые бы ссылались на документ со схемой, поскольку элементы схемы
+имеют слабые ссылки на саму схему и не могут предотвратить ее удаление.
+Для предотвращения очитски документа схемы, ссылка на него сохраняется в
+атрибуте документа C<schemaDocument>, что обеспечит жизнь схемы на протяжении
+жизни документа.
+
+Преобразование происходит рекурсивно, сначала используется метод
+C<NavigateCreate> для создания элемента соответсвующего свойству объекта,
+затем вызывается метод C<Transform> для преобразования значения свойства, при
+этом C<currentNode> указывает на только что созданный элемент документа.
+
+=head1 MEMBERS
+
+=head2 C<CTOR($docName,$schema)>
+
+Создает преобразование, при этом будет создан документ состоящий только из
+корневого элемента с именем C<$docName> и будет найдена подходящий для него
+элемент схемы C<$schema>. 
+
+=over
+
+=item * C<$docName>
+
+Имя корневого узла документа, которое будет использовано для поиска
+соответствующего элемента схемы C<$schema>
+
+=item * C<$schema>
+
+Схема, содержащая описание документа. Если в данной схеме нет описания корневого
+элемента с именем C<$docName>, будет вызвано исключение.
+
+=back
+
+=head2 C<[get]documentSchema>
+
+Элемент схемы C<ComplexNode> соответствующий документу. Определяется в
+конструкторе исходя из имени документа. 
+
+=head2 C<[get]currentNode>
+
+Текущий элемент документа. После создания преобразования - это сам документ.
+Данное свойство использется внутри преобразования для работы с текущим
+элементом.
+
+=head2 C<[virtual]StoreObject($node,$data)>
+
+Метод, который вызывается преобразованием в случае если текущий узел документа
+является простым, а значени которое ему соответсвует является объектом (ссылкой).
+
+По-умолчанию будет выполнено присваивание C<< $node->nodeValue($data) >>, однако
+это можно заменить, например, на преобразование в строку.
+
+=head2 C<inflateNodeValue($data)>
+
+Метод который используется для преобразования значений к правильным типам,
+используя атрибут C<inflator> элемента схемы. Этот метод можно использовать для
+C<TransformPlain>, однако по-умолчанию он не используется, поскольку
+предполагается, что входной объект имеет уже преобразованные значения в своих
+свойствах.
+
 =cut
\ No newline at end of file