comparison lib/IMPL/DOM/Document.pm @ 407:c6e90e02dd17 ref20150831

renamed Lib->lib
author cin
date Fri, 04 Sep 2015 19:40:23 +0300
parents
children
comparison
equal deleted inserted replaced
406:f23fcb19d3c1 407:c6e90e02dd17
1 package IMPL::DOM::Document;
2 use strict;
3 use warnings;
4
5 use IMPL::lang;
6 use IMPL::Const qw(:prop);
7 use IMPL::declare {
8 require => {
9 DOMNode => 'IMPL::DOM::Node'
10 },
11 base => [
12 DOMNode => '@_'
13 ],
14 props => [
15 schemaDocument => PROP_RW
16 ]
17 };
18
19 sub document {
20 return $_[0];
21 }
22
23 sub Create {
24 my ($this,$nodeName,$class,$refProps) = @_;
25
26 if ( ref $class eq 'HASH' ) {
27 $refProps = $class;
28 $class = undef;
29 }
30
31 $class ||= DOMNode;
32 $refProps ||= {};
33
34 delete $refProps->{nodeName};
35
36 die new IMPL::Exception("class is not specified") unless $class;
37 return $class->new(
38 nodeName => $nodeName,
39 document => $this,
40 %$refProps
41 );
42 }
43
44 sub save {
45 my ($this,$writer) = @_;
46
47 $writer->xmlDecl(undef,'yes');
48 $this->SUPER::save($writer);
49 $writer->end();
50 }
51
52 {
53 my $empty;
54 sub Empty() {
55 return $empty ? $empty : ($empty = __PACKAGE__->new(nodeName => 'Empty'));
56 }
57 }
58
59 1;
60 __END__
61
62 =pod
63
64 =head1 NAME
65
66 C<IMPL::DOM::Document> DOM документ.
67
68 =head1 DESCRIPTION
69
70 Документ, позволяет создавать узлы определенных типов, что позволяет абстрагироваться
71 от механизмов реального создания объектов. Т.о. например C<IMPL::DOM::Navigator::Builder>
72 может формировать произвольные документы.
73
74 =head1 SYNOPSIS
75
76 =begin code
77
78 package MyDocument;
79 use parent qw(IMPL::DOM::Document);
80
81 sub Create {
82 my $this = shift;
83 my ($name,$class,$hashProps) = @_;
84
85 if ($class eq 'Info') {
86 return MyInfo->new($name,$hashProps->{date},$hashProps->{description});
87 } else {
88 # leave as it is
89 return $this->SUPER::Create(@_);
90 }
91 }
92
93 =end code
94
95 =head1 METHODS
96
97 =over
98
99 =item C< Create($nodeName,$class,$hashProps) >
100
101 Реализация по умолчанию. Создает узел определеннго типа с определенным именем и свойствами.
102
103 =begin code
104
105 sub Create {
106 my ($this,$nodeName,$class,$hashProps) = @_;
107
108 return $class->new (
109 nodeName => $nodeName,
110 document => $this,
111 %$hashProps
112 );
113 }
114
115 =end code
116
117 =item C< save($writer) >
118
119 Сохраняет документ в виде XML узла и вызывает C<< $writer->end() >>.
120
121 =over
122
123 =item C<$writer>
124
125 Объект с интерфейсом C<XML::Writer> который будет использован для записи
126 содержимого документа
127
128 =back
129
130 =back
131
132 =cut