diff Lib/IMPL/DOM/Navigator.pm @ 13:bb8d67f811ea

merge heads
author Sergey
date Wed, 02 Sep 2009 23:11:14 +0400
parents 955b2324c1bf 75980091813b
children 818c74b038ae
line wrap: on
line diff
--- a/Lib/IMPL/DOM/Navigator.pm	Mon Aug 31 01:37:43 2009 +0400
+++ b/Lib/IMPL/DOM/Navigator.pm	Wed Sep 02 23:11:14 2009 +0400
@@ -3,7 +3,77 @@
 use warnings;
 
 use base qw(IMPL::Object);
+use IMPL::Class::Property;
+use IMPL::Class::Property::Direct;
+BEGIN {
+    public _direct property Path => prop_get | owner_set;
+    public _direct property Current => prop_get | owner_set;
+}
 
+sub CTOR {
+    my ($this,$CurrentNode) = @_;
+    
+    $this->{$Current} = $CurrentNode or die IMPL::InvalidArgumentException("A starting node is a required paramater");
+}
 
+sub Navigate {
+    my ($this,$query) = @_;
+    
+    if ( my ($newNode) = $this->{$Current}->selectNodes($query) ) {
+        push @{$this->{$Path}}, $this->{$Current};
+        return $this->{$Current} = $newNode;
+    } else {
+        return undef;
+    }
+}
+
+sub Back {
+    my ($this) = @_;
+    
+    if ( my $newNode = $this->{$Path} ? pop @{$this->{$Path}} : undef ) {
+        return $this->{$Current} = $newNode;
+    } else {
+        return undef;
+    }
+}
+
+sub PathToString {
+    my $this = shift;
+    
+    join('/',map $_->nodeName, $this->{$Path} ? (@{$this->{$Path}}, $this->{$Current}) : $this->{$Current});
+}
 
 1;
+
+__END__
+=pod
+
+=head1 DESCRIPTION
+
+Объект для хождения по дереву DOM объектов.
+
+=head1 METHODS
+
+=over
+
+=item C<$obj->new($nodeStart)>
+
+Создает объект навигатора с указанной начальной позицией.
+
+=item C<$obj->Navigate($query)>
+
+Перейти в новый узел используя запрос C<$query>. На данный момент запросом может
+быть только имя узла и будет взят только первый узел. Если по запросу ничего не
+найдено, переход не будет осуществлен.
+
+Возвращает либо новый узел в который перешли, либо C<undef>.
+
+=item C<$obj->Back()>
+
+Возвращается в предыдущий узел, если таковой есть.
+
+Возвращает либо узел в который перешли, либо C<undef>.
+
+=back
+
+=cut
\ No newline at end of file