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