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