comparison 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
comparison
equal deleted inserted replaced
14:65a7bb156fb7 15:16795016e70b
9 BEGIN { 9 BEGIN {
10 protected _direct property _navigatorSchema => prop_all; 10 protected _direct property _navigatorSchema => prop_all;
11 public _direct property Document => prop_get | owner_set; 11 public _direct property Document => prop_get | owner_set;
12 } 12 }
13 13
14 __PACKAGE__->PassThroughArgs; 14 our %CTOR = (
15 'IMPL::DOM::Navigator' => sub { $_[0] } # IMPL::DOM::Navigator($domDocument)
16 );
15 17
16 sub CTOR { 18 sub CTOR {
17 my ($this,$domDocument,$schema) = @_; 19 my ($this,$domDocument,$schema) = @_;
18 20
19 $this->{$Document} = $domDocument; 21 $this->{$Document} = $domDocument;
22 24
23 sub NavigateCreate { 25 sub NavigateCreate {
24 my ($this,$nodeName,%props) = @_; 26 my ($this,$nodeName,%props) = @_;
25 27
26 if ( my $nodeSchema = $this->{$_navigatorSchema}->Navigate(sub { $_[0]->nodeName eq $nodeName or $_[0]->isa('IMPL::DOM::Schema::AnyNode') }) ) { 28 if ( my $nodeSchema = $this->{$_navigatorSchema}->Navigate(sub { $_[0]->nodeName eq $nodeName or $_[0]->isa('IMPL::DOM::Schema::AnyNode') }) ) {
27 my $class = $nodeSchema->type; 29 my $class = delete $props{type} || $nodeSchema->type || $nodeName;
28 30
29 my $node = $this->{$Document}->Create($nodeName, $class, \%props); 31 my $node = $this->{$Document}->Create(delete $props{nodeName} || $nodeName, $class, \%props);
30 32
31 $this->Current()->appendNode($node); 33 $this->Current()->appendNode($node);
32 $this->Current($node); 34 $this->Current($node);
33 35
34 } else { 36 } else {
35 die new IMPL::InvalidOperationException("Requested elemnt not found in the schema"); 37 die new IMPL::InvalidOperationException("Requested elemnt not found in the schema");
36 } 38 }
37 } 39 }
38 40
41 sub Back {
42 my ($this) = @_;
43
44 $this->{$_navigatorSchema}->Back;
45 return $this->SUPER::Back();
46 }
47
39 1; 48 1;
49
50 __END__
51 =pod
52
53 =head1 SYNOPSIS
54
55 my $builder = new IMPL::DOM::Navigator::Builder(new MyApp::Document,$schema);
56 my $reader = new IMPL::DOM::XMLReader(Navigator => $builder);
57
58 $reader->ParseFile("document.xml");
59
60 my @errors = $schema->Validate($builder->Document);
61
62 =head1 DESCRIPTION
63
64 Построитель DOM документов по указанной схеме. Обычно используется в связке
65 с объектами для чтения такими как C<IMPL::DOM::XMLReader>.
66
67 =head1 METHODS
68
69 =over
70
71 =item C<CTOR($domDocument,$schema)>
72
73 Создает новый объект, принимает на вход пустой (но не обязательно) документ и
74 схему.
75
76 =item C<< $obj->NavigateCreate($nodeName) >>
77
78 Создает новый узел с указанным именем и переходит в него. В случае если в схеме
79 подходящий узел не найден, то вызывается исключение.
80
81 При этом схема узла производится по имени, после чего определяется класс для
82 создания узла, по алгоритму
83
84 =over
85
86 =item Проверяется свойство C<type> и если оно есть, то используется оно
87
88 =item Проверяется свойство C<type> самого элемента схемы, если оно есть, то
89 используется оно.
90
91 =item В качестве класса берется имя узла
92
93 =back
94
95 Также имя создаваемго узла может быть переопределено свойством C<nodeName>.
96
97 Т.о. узел вида C<< <ComplexNode nodeName="Box" type="Container"> >> приведет
98 к созданию C<< Container->new(nodeName => 'Box') >>.
99
100 =back
101
102 =cut