407
|
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
|