Mercurial > pub > Impl
diff lib/IMPL/DOM/Document.pm @ 407:c6e90e02dd17 ref20150831
renamed Lib->lib
author | cin |
---|---|
date | Fri, 04 Sep 2015 19:40:23 +0300 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/IMPL/DOM/Document.pm Fri Sep 04 19:40:23 2015 +0300 @@ -0,0 +1,132 @@ +package IMPL::DOM::Document; +use strict; +use warnings; + +use IMPL::lang; +use IMPL::Const qw(:prop); +use IMPL::declare { + require => { + DOMNode => 'IMPL::DOM::Node' + }, + base => [ + DOMNode => '@_' + ], + props => [ + schemaDocument => PROP_RW + ] +}; + +sub document { + return $_[0]; +} + +sub Create { + my ($this,$nodeName,$class,$refProps) = @_; + + if ( ref $class eq 'HASH' ) { + $refProps = $class; + $class = undef; + } + + $class ||= DOMNode; + $refProps ||= {}; + + delete $refProps->{nodeName}; + + die new IMPL::Exception("class is not specified") unless $class; + return $class->new( + nodeName => $nodeName, + document => $this, + %$refProps + ); +} + +sub save { + my ($this,$writer) = @_; + + $writer->xmlDecl(undef,'yes'); + $this->SUPER::save($writer); + $writer->end(); +} + +{ + my $empty; + sub Empty() { + return $empty ? $empty : ($empty = __PACKAGE__->new(nodeName => 'Empty')); + } +} + +1; +__END__ + +=pod + +=head1 NAME + +C<IMPL::DOM::Document> DOM документ. + +=head1 DESCRIPTION + +Документ, позволяет создавать узлы определенных типов, что позволяет абстрагироваться +от механизмов реального создания объектов. Т.о. например C<IMPL::DOM::Navigator::Builder> +может формировать произвольные документы. + +=head1 SYNOPSIS + +=begin code + +package MyDocument; +use parent qw(IMPL::DOM::Document); + +sub Create { + my $this = shift; + my ($name,$class,$hashProps) = @_; + + if ($class eq 'Info') { + return MyInfo->new($name,$hashProps->{date},$hashProps->{description}); + } else { + # leave as it is + return $this->SUPER::Create(@_); + } +} + +=end code + +=head1 METHODS + +=over + +=item C< Create($nodeName,$class,$hashProps) > + +Реализация по умолчанию. Создает узел определеннго типа с определенным именем и свойствами. + +=begin code + +sub Create { + my ($this,$nodeName,$class,$hashProps) = @_; + + return $class->new ( + nodeName => $nodeName, + document => $this, + %$hashProps + ); +} + +=end code + +=item C< save($writer) > + +Сохраняет документ в виде XML узла и вызывает C<< $writer->end() >>. + +=over + +=item C<$writer> + +Объект с интерфейсом C<XML::Writer> который будет использован для записи +содержимого документа + +=back + +=back + +=cut