annotate Lib/IMPL/DOM/Node.pm @ 31:d59526f6310e

Small fixes to Test framework (correct handlinf of the compilation errors in the test units) Imported and refactored SQL DB schema from the old project
author Sergey
date Mon, 09 Nov 2009 01:39:16 +0300
parents dd4d72600c69
children a8086f85a571
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
03e58a454b20 Создан репозитарий
Sergey
parents:
diff changeset
1 package IMPL::DOM::Node;
03e58a454b20 Создан репозитарий
Sergey
parents:
diff changeset
2 use strict;
03e58a454b20 Создан репозитарий
Sergey
parents:
diff changeset
3 use warnings;
03e58a454b20 Создан репозитарий
Sergey
parents:
diff changeset
4
11
75980091813b DOM и навигация
Sergey
parents: 7
diff changeset
5 use base qw(IMPL::Object);
0
03e58a454b20 Создан репозитарий
Sergey
parents:
diff changeset
6
4
e59f44f75f20 DOM - в разработке
Sergey
parents: 1
diff changeset
7 use IMPL::Object::List;
0
03e58a454b20 Создан репозитарий
Sergey
parents:
diff changeset
8 use IMPL::Class::Property;
03e58a454b20 Создан репозитарий
Sergey
parents:
diff changeset
9 use IMPL::Class::Property::Direct;
03e58a454b20 Создан репозитарий
Sergey
parents:
diff changeset
10 use Scalar::Util qw(weaken);
03e58a454b20 Создан репозитарий
Sergey
parents:
diff changeset
11
1
3b418b134d8c ORM in progress
Sergey
parents: 0
diff changeset
12 use IMPL::Exception;
3b418b134d8c ORM in progress
Sergey
parents: 0
diff changeset
13
0
03e58a454b20 Создан репозитарий
Sergey
parents:
diff changeset
14 BEGIN {
4
e59f44f75f20 DOM - в разработке
Sergey
parents: 1
diff changeset
15 public _direct property nodeName => prop_get | owner_set;
e59f44f75f20 DOM - в разработке
Sergey
parents: 1
diff changeset
16 public _direct property isComplex => { get => \&_getIsComplex } ;
e59f44f75f20 DOM - в разработке
Sergey
parents: 1
diff changeset
17 public _direct property nodeValue => prop_all;
e59f44f75f20 DOM - в разработке
Sergey
parents: 1
diff changeset
18 public _direct property childNodes => { get => \&_getChildNodes };
e59f44f75f20 DOM - в разработке
Sergey
parents: 1
diff changeset
19 public _direct property parentNode => prop_get ;
18
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
20 public _direct property rootNode => { get => \&_getRootNode};
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
21 private _direct property _propertyMap => prop_all ;
0
03e58a454b20 Создан репозитарий
Sergey
parents:
diff changeset
22 }
03e58a454b20 Создан репозитарий
Sergey
parents:
diff changeset
23
03e58a454b20 Создан репозитарий
Sergey
parents:
diff changeset
24 sub CTOR {
11
75980091813b DOM и навигация
Sergey
parents: 7
diff changeset
25 my ($this,%args) = @_;
0
03e58a454b20 Создан репозитарий
Sergey
parents:
diff changeset
26
11
75980091813b DOM и навигация
Sergey
parents: 7
diff changeset
27 $this->nodeName($args{nodeName}) or die new IMPL::InvalidArgumentException("A name is required");
18
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
28 $this->nodeValue($args{nodeValue});
0
03e58a454b20 Создан репозитарий
Sergey
parents:
diff changeset
29 }
03e58a454b20 Создан репозитарий
Sergey
parents:
diff changeset
30
03e58a454b20 Создан репозитарий
Sergey
parents:
diff changeset
31 sub insertNode {
03e58a454b20 Создан репозитарий
Sergey
parents:
diff changeset
32 my ($this,$node,$pos) = @_;
4
e59f44f75f20 DOM - в разработке
Sergey
parents: 1
diff changeset
33
e59f44f75f20 DOM - в разработке
Sergey
parents: 1
diff changeset
34 die new IMPL::InvalidOperationException("You can't insert the node to itselft") if $this == $node;
e59f44f75f20 DOM - в разработке
Sergey
parents: 1
diff changeset
35
e59f44f75f20 DOM - в разработке
Sergey
parents: 1
diff changeset
36 $node->{$parentNode}->removeNode($node) if ($node->{$parentNode});
e59f44f75f20 DOM - в разработке
Sergey
parents: 1
diff changeset
37
e59f44f75f20 DOM - в разработке
Sergey
parents: 1
diff changeset
38 $this->childNodes->InsertAt($pos,$node);
e59f44f75f20 DOM - в разработке
Sergey
parents: 1
diff changeset
39
e59f44f75f20 DOM - в разработке
Sergey
parents: 1
diff changeset
40 $node->_setParent( $this );
e59f44f75f20 DOM - в разработке
Sergey
parents: 1
diff changeset
41
e59f44f75f20 DOM - в разработке
Sergey
parents: 1
diff changeset
42 return $node;
e59f44f75f20 DOM - в разработке
Sergey
parents: 1
diff changeset
43 }
e59f44f75f20 DOM - в разработке
Sergey
parents: 1
diff changeset
44
30
dd4d72600c69 ORM in works
Sergey
parents: 24
diff changeset
45 sub appendChild {
16
75d55f4ee263 Окончательная концепция описания схем и построения DOM документов
Sergey
parents: 14
diff changeset
46 my ($this,$node) = @_;
14
65a7bb156fb7 Дом модель и схема
Sergey
parents: 11
diff changeset
47
65a7bb156fb7 Дом модель и схема
Sergey
parents: 11
diff changeset
48 die new IMPL::InvalidOperationException("You can't insert the node to itselft") if $this == $node;
65a7bb156fb7 Дом модель и схема
Sergey
parents: 11
diff changeset
49
65a7bb156fb7 Дом модель и схема
Sergey
parents: 11
diff changeset
50 $node->{$parentNode}->removeNode($node) if ($node->{$parentNode});
65a7bb156fb7 Дом модель и схема
Sergey
parents: 11
diff changeset
51
18
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
52 my $children = $this->childNodes;
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
53 $children->Append($node);
14
65a7bb156fb7 Дом модель и схема
Sergey
parents: 11
diff changeset
54
65a7bb156fb7 Дом модель и схема
Sergey
parents: 11
diff changeset
55 $node->_setParent( $this );
65a7bb156fb7 Дом модель и схема
Sergey
parents: 11
diff changeset
56
65a7bb156fb7 Дом модель и схема
Sergey
parents: 11
diff changeset
57 return $node;
65a7bb156fb7 Дом модель и схема
Sergey
parents: 11
diff changeset
58 }
65a7bb156fb7 Дом модель и схема
Sergey
parents: 11
diff changeset
59
30
dd4d72600c69 ORM in works
Sergey
parents: 24
diff changeset
60 sub appendNode {
dd4d72600c69 ORM in works
Sergey
parents: 24
diff changeset
61 goto &appendChild;
dd4d72600c69 ORM in works
Sergey
parents: 24
diff changeset
62 }
dd4d72600c69 ORM in works
Sergey
parents: 24
diff changeset
63
16
75d55f4ee263 Окончательная концепция описания схем и построения DOM документов
Sergey
parents: 14
diff changeset
64 sub appendRange {
75d55f4ee263 Окончательная концепция описания схем и построения DOM документов
Sergey
parents: 14
diff changeset
65 my ($this,@range) = @_;
75d55f4ee263 Окончательная концепция описания схем и построения DOM документов
Sergey
parents: 14
diff changeset
66
75d55f4ee263 Окончательная концепция описания схем и построения DOM документов
Sergey
parents: 14
diff changeset
67 die new IMPL::InvalidOperationException("You can't insert the node to itselft") if grep $_ == $this, @range;
75d55f4ee263 Окончательная концепция описания схем и построения DOM документов
Sergey
parents: 14
diff changeset
68
75d55f4ee263 Окончательная концепция описания схем и построения DOM документов
Sergey
parents: 14
diff changeset
69 foreach my $node (@range) {
75d55f4ee263 Окончательная концепция описания схем и построения DOM документов
Sergey
parents: 14
diff changeset
70 $node->{$parentNode}->removeNode($node) if ($node->{$parentNode});
75d55f4ee263 Окончательная концепция описания схем и построения DOM документов
Sergey
parents: 14
diff changeset
71 $node->_setParent( $this );
75d55f4ee263 Окончательная концепция описания схем и построения DOM документов
Sergey
parents: 14
diff changeset
72 }
75d55f4ee263 Окончательная концепция описания схем и построения DOM документов
Sergey
parents: 14
diff changeset
73
75d55f4ee263 Окончательная концепция описания схем и построения DOM документов
Sergey
parents: 14
diff changeset
74 $this->childNodes->Append(@range);
75d55f4ee263 Окончательная концепция описания схем и построения DOM документов
Sergey
parents: 14
diff changeset
75
75d55f4ee263 Окончательная концепция описания схем и построения DOM документов
Sergey
parents: 14
diff changeset
76 return $this;
75d55f4ee263 Окончательная концепция описания схем и построения DOM документов
Sergey
parents: 14
diff changeset
77 }
75d55f4ee263 Окончательная концепция описания схем и построения DOM документов
Sergey
parents: 14
diff changeset
78
4
e59f44f75f20 DOM - в разработке
Sergey
parents: 1
diff changeset
79 sub _getChildNodes {
e59f44f75f20 DOM - в разработке
Sergey
parents: 1
diff changeset
80 my ($this) = @_;
e59f44f75f20 DOM - в разработке
Sergey
parents: 1
diff changeset
81
e59f44f75f20 DOM - в разработке
Sergey
parents: 1
diff changeset
82 $this->{$childNodes} = new IMPL::Object::List() unless $this->{$childNodes};
18
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
83 return $this->{$childNodes};
0
03e58a454b20 Создан репозитарий
Sergey
parents:
diff changeset
84 }
03e58a454b20 Создан репозитарий
Sergey
parents:
diff changeset
85
03e58a454b20 Создан репозитарий
Sergey
parents:
diff changeset
86 sub removeNode {
03e58a454b20 Создан репозитарий
Sergey
parents:
diff changeset
87 my ($this,$node) = @_;
4
e59f44f75f20 DOM - в разработке
Sergey
parents: 1
diff changeset
88
e59f44f75f20 DOM - в разработке
Sergey
parents: 1
diff changeset
89 if ($this == $node->{$parentNode}) {
e59f44f75f20 DOM - в разработке
Sergey
parents: 1
diff changeset
90 $this->childNodes->RemoveItem($node);
18
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
91 $node->_setParent(undef);
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
92 return $node;
4
e59f44f75f20 DOM - в разработке
Sergey
parents: 1
diff changeset
93 } else {
e59f44f75f20 DOM - в разработке
Sergey
parents: 1
diff changeset
94 die new IMPL::InvalidOperationException("The specified node isn't belong to this node");
e59f44f75f20 DOM - в разработке
Sergey
parents: 1
diff changeset
95 }
0
03e58a454b20 Создан репозитарий
Sergey
parents:
diff changeset
96 }
03e58a454b20 Создан репозитарий
Sergey
parents:
diff changeset
97
7
94d47b388442 Улучшены тесты
Sergey
parents: 6
diff changeset
98 sub replaceNodeAt {
94d47b388442 Улучшены тесты
Sergey
parents: 6
diff changeset
99 my ($this,$index,$node) = @_;
94d47b388442 Улучшены тесты
Sergey
parents: 6
diff changeset
100
94d47b388442 Улучшены тесты
Sergey
parents: 6
diff changeset
101 my $nodeOld = $this->childNodes->[$index];
94d47b388442 Улучшены тесты
Sergey
parents: 6
diff changeset
102
94d47b388442 Улучшены тесты
Sergey
parents: 6
diff changeset
103 die new IMPL::InvalidOperationException("You can't insert the node to itselft") if $this == $node;
94d47b388442 Улучшены тесты
Sergey
parents: 6
diff changeset
104
94d47b388442 Улучшены тесты
Sergey
parents: 6
diff changeset
105 # unlink node from previous parent
94d47b388442 Улучшены тесты
Sergey
parents: 6
diff changeset
106 $node->{$parentNode}->removeNode($node) if ($node->{$parentNode});
94d47b388442 Улучшены тесты
Sergey
parents: 6
diff changeset
107
94d47b388442 Улучшены тесты
Sergey
parents: 6
diff changeset
108 # replace (or set) old node
94d47b388442 Улучшены тесты
Sergey
parents: 6
diff changeset
109 $this->childNodes->[$index] = $node;
94d47b388442 Улучшены тесты
Sergey
parents: 6
diff changeset
110
18
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
111 # set new parent
7
94d47b388442 Улучшены тесты
Sergey
parents: 6
diff changeset
112 $node->_setParent( $this );
94d47b388442 Улучшены тесты
Sergey
parents: 6
diff changeset
113
94d47b388442 Улучшены тесты
Sergey
parents: 6
diff changeset
114 # unlink old node if we have one
18
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
115 $nodeOld->_setParent(undef) if $nodeOld;
7
94d47b388442 Улучшены тесты
Sergey
parents: 6
diff changeset
116
94d47b388442 Улучшены тесты
Sergey
parents: 6
diff changeset
117 # return old node
94d47b388442 Улучшены тесты
Sergey
parents: 6
diff changeset
118 return $nodeOld;
94d47b388442 Улучшены тесты
Sergey
parents: 6
diff changeset
119 }
94d47b388442 Улучшены тесты
Sergey
parents: 6
diff changeset
120
0
03e58a454b20 Создан репозитарий
Sergey
parents:
diff changeset
121 sub removeAt {
03e58a454b20 Создан репозитарий
Sergey
parents:
diff changeset
122 my ($this,$pos) = @_;
4
e59f44f75f20 DOM - в разработке
Sergey
parents: 1
diff changeset
123
e59f44f75f20 DOM - в разработке
Sergey
parents: 1
diff changeset
124 if ( my $node = $this->childNodes->RemoveAt($pos) ) {
18
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
125 $node->_setParent(undef);
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
126 return $node;
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
127 } else {
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
128 return undef;
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
129 }
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
130 }
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
131
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
132 sub removeLast {
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
133 my ($this) = @_;
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
134
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
135 if ( my $node = $this->{$childNodes} ? $this->{$childNodes}->RemoveLast() : undef) {
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
136 $node->_setParent(undef);
4
e59f44f75f20 DOM - в разработке
Sergey
parents: 1
diff changeset
137 return $node;
e59f44f75f20 DOM - в разработке
Sergey
parents: 1
diff changeset
138 } else {
e59f44f75f20 DOM - в разработке
Sergey
parents: 1
diff changeset
139 return undef;
e59f44f75f20 DOM - в разработке
Sergey
parents: 1
diff changeset
140 }
0
03e58a454b20 Создан репозитарий
Sergey
parents:
diff changeset
141 }
03e58a454b20 Создан репозитарий
Sergey
parents:
diff changeset
142
18
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
143 sub removeSelected {
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
144 my ($this,$query) = @_;
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
145
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
146 my @newSet;
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
147 my @result;
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
148
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
149 if (ref $query eq 'CODE') {
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
150 &$query($_) ? push @result, $_ : push @newSet, $_ foreach @{$this->childNodes};
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
151 } elsif (defined $query) {
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
152 $_->nodeName eq $query ? push @result, $_ : push @newSet, $_ foreach @{$this->childNodes};
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
153 } else {
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
154 my $children = $this->childNodes;
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
155 $_->_setParent(undef) foreach @$children;
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
156 delete $this->{$childNodes};
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
157 return wantarray ? @$children : $children;
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
158 }
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
159
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
160 $_->_setParent(undef) foreach @result;
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
161
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
162 $this->{$childNodes} = @newSet ? bless \@newSet ,'IMPL::Object::List' : undef;
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
163
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
164 return wantarray ? @result : \@result;
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
165 }
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
166
0
03e58a454b20 Создан репозитарий
Sergey
parents:
diff changeset
167 sub selectNodes {
14
65a7bb156fb7 Дом модель и схема
Sergey
parents: 11
diff changeset
168 my ($this,$query) = @_;
18
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
169
14
65a7bb156fb7 Дом модель и схема
Sergey
parents: 11
diff changeset
170 my @result;
4
e59f44f75f20 DOM - в разработке
Sergey
parents: 1
diff changeset
171
14
65a7bb156fb7 Дом модель и схема
Sergey
parents: 11
diff changeset
172 if (ref $query eq 'CODE') {
65a7bb156fb7 Дом модель и схема
Sergey
parents: 11
diff changeset
173 @result = grep &$query($_), @{$this->childNodes};
24
7f00786f8210 Первая рабочая реазизация схемы и навигаторов
Sergey
parents: 21
diff changeset
174 } elsif (ref $query eq 'ARRAY' ) {
7f00786f8210 Первая рабочая реазизация схемы и навигаторов
Sergey
parents: 21
diff changeset
175 my %keys = map (($_,1),@$query);
7f00786f8210 Первая рабочая реазизация схемы и навигаторов
Sergey
parents: 21
diff changeset
176 @result = grep $keys{$_->nodeName}, @{$this->childNodes};
18
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
177 } elsif (defined $query) {
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
178 @result = grep $_->nodeName eq $query, @{$this->childNodes};
14
65a7bb156fb7 Дом модель и схема
Sergey
parents: 11
diff changeset
179 } else {
18
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
180 if (wantarray) {
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
181 return @{$this->childNodes};
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
182 } else {
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
183 @result = $this->childNodes;
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
184 return \@result;
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
185 }
14
65a7bb156fb7 Дом модель и схема
Sergey
parents: 11
diff changeset
186 }
4
e59f44f75f20 DOM - в разработке
Sergey
parents: 1
diff changeset
187
e59f44f75f20 DOM - в разработке
Sergey
parents: 1
diff changeset
188 return wantarray ? @result : \@result;
0
03e58a454b20 Создан репозитарий
Sergey
parents:
diff changeset
189 }
03e58a454b20 Создан репозитарий
Sergey
parents:
diff changeset
190
7
94d47b388442 Улучшены тесты
Sergey
parents: 6
diff changeset
191 sub firstChild {
94d47b388442 Улучшены тесты
Sergey
parents: 6
diff changeset
192 @_ >=2 ? $_[0]->replaceNodeAt(0,$_[1]) : $_[0]->childNodes->[0];
94d47b388442 Улучшены тесты
Sergey
parents: 6
diff changeset
193 }
94d47b388442 Улучшены тесты
Sergey
parents: 6
diff changeset
194
4
e59f44f75f20 DOM - в разработке
Sergey
parents: 1
diff changeset
195 sub _getIsComplex {
e59f44f75f20 DOM - в разработке
Sergey
parents: 1
diff changeset
196 $_[0]->childNodes->Count ? 1 : 0;
e59f44f75f20 DOM - в разработке
Sergey
parents: 1
diff changeset
197 }
e59f44f75f20 DOM - в разработке
Sergey
parents: 1
diff changeset
198
18
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
199 sub _getRootNode {
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
200 $_[0]->{$rootNode} || $_[0];
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
201 }
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
202
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
203 sub _updateRootRefs {
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
204 my ($this) = @_;
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
205
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
206 if ( my $newRoot = $this->{$parentNode} ? $this->{$parentNode}->rootNode : undef) {
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
207 if ($this->{$rootNode} ? $this->{$rootNode} != $newRoot : 1 ) {
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
208 $this->{$rootNode} = $newRoot;
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
209 weaken($this->{$rootNode});
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
210 if ($this->{$childNodes}) {
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
211 $_->_updateRootRefs foreach @{$this->{$childNodes}};
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
212 }
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
213 }
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
214 } elsif($this->{$rootNode}) {
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
215 delete $this->{$rootNode};
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
216 if ($this->{$childNodes}) {
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
217 $_->_updateRootRefs foreach @{$this->{$childNodes}};
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
218 }
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
219 }
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
220 }
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
221
4
e59f44f75f20 DOM - в разработке
Sergey
parents: 1
diff changeset
222 sub _setParent {
11
75980091813b DOM и навигация
Sergey
parents: 7
diff changeset
223 my ($this,$node) = @_;
4
e59f44f75f20 DOM - в разработке
Sergey
parents: 1
diff changeset
224
18
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
225
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
226 if (($node || 0) != ($this->{$parentNode} || 0)) {
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
227 if ($node) {
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
228 $this->{$parentNode} = $node;
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
229 # prevent from creating cyclicreferences
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
230 weaken($this->{$parentNode});
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
231 } else {
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
232 delete $this->{$parentNode};
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
233 }
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
234 $this->_updateRootRefs;
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
235 }
0
03e58a454b20 Создан репозитарий
Sergey
parents:
diff changeset
236 }
03e58a454b20 Создан репозитарий
Sergey
parents:
diff changeset
237
03e58a454b20 Создан репозитарий
Sergey
parents:
diff changeset
238 sub text {
03e58a454b20 Создан репозитарий
Sergey
parents:
diff changeset
239 my ($this) = @_;
4
e59f44f75f20 DOM - в разработке
Sergey
parents: 1
diff changeset
240
18
818c74b038ae DOM Schema + tests
Sergey
parents: 16
diff changeset
241 join '', $this->nodeValue || '', map $_->nodeValue || '', @{$this->childNodes};
0
03e58a454b20 Создан репозитарий
Sergey
parents:
diff changeset
242 }
03e58a454b20 Создан репозитарий
Sergey
parents:
diff changeset
243
21
fafe56cfcd69 temp commit
Sergey
parents: 18
diff changeset
244 sub nodeProperty {
0
03e58a454b20 Создан репозитарий
Sergey
parents:
diff changeset
245 my $this = shift;
03e58a454b20 Создан репозитарий
Sergey
parents:
diff changeset
246 my $name = shift;
03e58a454b20 Создан репозитарий
Sergey
parents:
diff changeset
247
03e58a454b20 Создан репозитарий
Sergey
parents:
diff changeset
248 if (@_) {
03e58a454b20 Создан репозитарий
Sergey
parents:
diff changeset
249 # set
6
e2cd73ccc5bd DOM In development
Sergey
parents: 4
diff changeset
250 return $this->{$_propertyMap}{$name} = shift;
0
03e58a454b20 Создан репозитарий
Sergey
parents:
diff changeset
251 } else {
6
e2cd73ccc5bd DOM In development
Sergey
parents: 4
diff changeset
252 return $this->{$_propertyMap}{$name};
0
03e58a454b20 Создан репозитарий
Sergey
parents:
diff changeset
253 }
03e58a454b20 Создан репозитарий
Sergey
parents:
diff changeset
254 }
03e58a454b20 Создан репозитарий
Sergey
parents:
diff changeset
255
24
7f00786f8210 Первая рабочая реазизация схемы и навигаторов
Sergey
parents: 21
diff changeset
256 sub qname {
7f00786f8210 Первая рабочая реазизация схемы и навигаторов
Sergey
parents: 21
diff changeset
257 $_[0]->{$nodeName};
7f00786f8210 Первая рабочая реазизация схемы и навигаторов
Sergey
parents: 21
diff changeset
258 }
7f00786f8210 Первая рабочая реазизация схемы и навигаторов
Sergey
parents: 21
diff changeset
259
7f00786f8210 Первая рабочая реазизация схемы и навигаторов
Sergey
parents: 21
diff changeset
260 sub path {
7f00786f8210 Первая рабочая реазизация схемы и навигаторов
Sergey
parents: 21
diff changeset
261 my ($this) = @_;
7f00786f8210 Первая рабочая реазизация схемы и навигаторов
Sergey
parents: 21
diff changeset
262
7f00786f8210 Первая рабочая реазизация схемы и навигаторов
Sergey
parents: 21
diff changeset
263 if ($this->parentNode) {
7f00786f8210 Первая рабочая реазизация схемы и навигаторов
Sergey
parents: 21
diff changeset
264 return $this->parentNode->path.'.'.$this->qname;
7f00786f8210 Первая рабочая реазизация схемы и навигаторов
Sergey
parents: 21
diff changeset
265 } else {
7f00786f8210 Первая рабочая реазизация схемы и навигаторов
Sergey
parents: 21
diff changeset
266 return $this->qname;
7f00786f8210 Первая рабочая реазизация схемы и навигаторов
Sergey
parents: 21
diff changeset
267 }
7f00786f8210 Первая рабочая реазизация схемы и навигаторов
Sergey
parents: 21
diff changeset
268 }
7f00786f8210 Первая рабочая реазизация схемы и навигаторов
Sergey
parents: 21
diff changeset
269
0
03e58a454b20 Создан репозитарий
Sergey
parents:
diff changeset
270 1;