Mercurial > pub > Impl
comparison Lib/IMPL/DOM/Navigator/SchemaNavigator.pm @ 18:818c74b038ae
DOM Schema + tests
author | Sergey |
---|---|
date | Thu, 10 Sep 2009 17:42:47 +0400 |
parents | |
children | 7f00786f8210 |
comparison
equal
deleted
inserted
replaced
17:7f88e01b58f8 | 18:818c74b038ae |
---|---|
1 package IMPL::DOM::Navigator::SchemaNavigator; | |
2 use strict; | |
3 use warnings; | |
4 | |
5 use base qw(IMPL::DOM::Navigator); | |
6 use IMPL::Class::Property; | |
7 use IMPL::Class::Property::Direct; | |
8 | |
9 __PACKAGE__->PassThroughArgs; | |
10 | |
11 BEGIN { | |
12 public _direct property Schema => prop_get; | |
13 } | |
14 | |
15 sub CTOR { | |
16 my ($this,$schema) = @_; | |
17 | |
18 $this->{$Schema} = $schema; | |
19 | |
20 die new IMPL::InvalidArgumentException("A schema object is required") unless $schema->isa('IMPL::DOM::Schema'); | |
21 } | |
22 | |
23 sub Navigate { | |
24 my ($this,$query) = @_; | |
25 | |
26 if (my ($newNode) = $this->Current->selectNodes($query)) { | |
27 if (ref $newNode eq 'IMPL::DOM::Schema::Node') { | |
28 $newNode = $this->{$Schema}->ResolveType($newNode->type) || $newNode; | |
29 } | |
30 return $this->_NavigateNode($newNode); | |
31 } else { | |
32 return undef; | |
33 } | |
34 } | |
35 | |
36 1; | |
37 __END__ | |
38 | |
39 =pod | |
40 | |
41 =head1 DESCRIPTION | |
42 | |
43 Навигатор для схемы, отличается от стандартного тем, что переходит по ссылкам вида <Node nodeName="SomeName" type="ReferencedType"/>. | |
44 При этом имя узла в который перешли будет отличаться от указанного в поисковом критерии. | |
45 | |
46 =cut |