diff 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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Lib/IMPL/DOM/Navigator/SchemaNavigator.pm	Thu Sep 10 17:42:47 2009 +0400
@@ -0,0 +1,46 @@
+package IMPL::DOM::Navigator::SchemaNavigator;
+use strict;
+use warnings;
+
+use base qw(IMPL::DOM::Navigator);
+use IMPL::Class::Property;
+use IMPL::Class::Property::Direct;
+
+__PACKAGE__->PassThroughArgs;
+
+BEGIN {
+    public _direct property Schema => prop_get;
+}
+
+sub CTOR {
+    my ($this,$schema) = @_;
+    
+    $this->{$Schema} = $schema;
+    
+    die new IMPL::InvalidArgumentException("A schema object is required") unless $schema->isa('IMPL::DOM::Schema');
+}
+
+sub Navigate {
+    my ($this,$query) = @_;
+    
+    if (my ($newNode) = $this->Current->selectNodes($query)) {
+        if (ref $newNode eq 'IMPL::DOM::Schema::Node') {
+            $newNode = $this->{$Schema}->ResolveType($newNode->type) || $newNode;
+        }
+        return $this->_NavigateNode($newNode);
+    } else {
+        return undef;
+    }
+}
+
+1;
+__END__
+
+=pod
+
+=head1 DESCRIPTION
+
+Навигатор для схемы, отличается от стандартного тем, что переходит по ссылкам вида <Node nodeName="SomeName" type="ReferencedType"/>.
+При этом имя узла в который перешли будет отличаться от указанного в поисковом критерии.
+
+=cut
\ No newline at end of file