Mercurial > pub > Impl
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 |
