Mercurial > pub > Impl
diff Lib/IMPL/DOM/Navigator/Builder.pm @ 15:16795016e70b
Dom schema in progress
author | Sergey |
---|---|
date | Mon, 07 Sep 2009 17:30:55 +0400 |
parents | 65a7bb156fb7 |
children | 75d55f4ee263 |
line wrap: on
line diff
--- a/Lib/IMPL/DOM/Navigator/Builder.pm Fri Sep 04 16:38:15 2009 +0400 +++ b/Lib/IMPL/DOM/Navigator/Builder.pm Mon Sep 07 17:30:55 2009 +0400 @@ -11,7 +11,9 @@ public _direct property Document => prop_get | owner_set; } -__PACKAGE__->PassThroughArgs; +our %CTOR = ( + 'IMPL::DOM::Navigator' => sub { $_[0] } # IMPL::DOM::Navigator($domDocument) +); sub CTOR { my ($this,$domDocument,$schema) = @_; @@ -24,9 +26,9 @@ my ($this,$nodeName,%props) = @_; if ( my $nodeSchema = $this->{$_navigatorSchema}->Navigate(sub { $_[0]->nodeName eq $nodeName or $_[0]->isa('IMPL::DOM::Schema::AnyNode') }) ) { - my $class = $nodeSchema->type; + my $class = delete $props{type} || $nodeSchema->type || $nodeName; - my $node = $this->{$Document}->Create($nodeName, $class, \%props); + my $node = $this->{$Document}->Create(delete $props{nodeName} || $nodeName, $class, \%props); $this->Current()->appendNode($node); $this->Current($node); @@ -36,4 +38,65 @@ } } +sub Back { + my ($this) = @_; + + $this->{$_navigatorSchema}->Back; + return $this->SUPER::Back(); +} + 1; + +__END__ +=pod + +=head1 SYNOPSIS + +my $builder = new IMPL::DOM::Navigator::Builder(new MyApp::Document,$schema); +my $reader = new IMPL::DOM::XMLReader(Navigator => $builder); + +$reader->ParseFile("document.xml"); + +my @errors = $schema->Validate($builder->Document); + +=head1 DESCRIPTION + +Построитель DOM документов по указанной схеме. Обычно используется в связке +с объектами для чтения такими как C<IMPL::DOM::XMLReader>. + +=head1 METHODS + +=over + +=item C<CTOR($domDocument,$schema)> + +Создает новый объект, принимает на вход пустой (но не обязательно) документ и +схему. + +=item C<< $obj->NavigateCreate($nodeName) >> + +Создает новый узел с указанным именем и переходит в него. В случае если в схеме +подходящий узел не найден, то вызывается исключение. + +При этом схема узла производится по имени, после чего определяется класс для +создания узла, по алгоритму + +=over + +=item Проверяется свойство C<type> и если оно есть, то используется оно + +=item Проверяется свойство C<type> самого элемента схемы, если оно есть, то +используется оно. + +=item В качестве класса берется имя узла + +=back + +Также имя создаваемго узла может быть переопределено свойством C<nodeName>. + +Т.о. узел вида C<< <ComplexNode nodeName="Box" type="Container"> >> приведет +к созданию C<< Container->new(nodeName => 'Box') >>. + +=back + +=cut \ No newline at end of file