diff lib/IMPL/DOM/Schema/ComplexNode.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/Schema/ComplexNode.pm	Fri Sep 04 19:40:23 2015 +0300
@@ -0,0 +1,62 @@
+package IMPL::DOM::Schema::ComplexNode;
+use strict;
+use warnings;
+
+use IMPL::declare {
+	base => [
+		'IMPL::DOM::Schema::Node' => sub {my %args = @_; $args{nodeName} ||= 'ComplexNode'; %args }
+	],
+	props => [
+		content => {
+	        get => \&_getContent,
+	        set => \&_setContent
+	    }
+	]
+};
+
+
+sub _getContent {
+    $_[0]->firstChild;
+}
+
+sub _setContent {
+    $_[0]->firstChild($_[1]);
+}
+
+sub Validate {
+    my ($this,$node,$ctx) = @_;
+    
+    # для случаев анонимных типов, указанных прямо в узле
+    $ctx->{schemaNode} ||= $this;
+    $ctx->{schemaType} = $this;
+    
+    map $_->Validate($node,$ctx), @{$this->childNodes};
+}
+
+1;
+
+__END__
+
+=pod
+
+=head1 DESCRIPTION
+
+Описывает сложный узел. Требует либо соответствие структуры, либо соответствия
+типу.
+
+Дочерними элементами могут быть правила контроля свойств и т.п.
+Первым дочерним элементом может быть только содержимое узла, см. C<content>
+
+=head2 PROPERTIES
+
+=over
+
+=item C<content>
+
+Содержимое узла, может быть либо C<IMPL::DOM::Schema::NodeSet> либо
+C<IMPL::DOM::Schema::NodeList>, в зависимости от того важен порядок или нет.
+Это свойство ссылается на первый дочерний элемент узла.
+
+=back
+
+=cut