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