view lib/IMPL/DOM/Schema/ComplexNode.pm @ 416:cc2cf8c0edc2 ref20150831

sync
author cin
date Thu, 29 Oct 2015 03:50:25 +0300
parents c6e90e02dd17
children
line wrap: on
line source

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