Mercurial > pub > Impl
view Lib/IMPL/DOM/Navigator.pm @ 20:267460284fb3
DOM Schema
author | Sergey |
---|---|
date | Tue, 22 Sep 2009 17:17:38 +0400 |
parents | 818c74b038ae |
children | 7f00786f8210 |
line wrap: on
line source
package IMPL::DOM::Navigator; use strict; 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 _NavigateNode { my ($this,$newNode) = @_; push @{$this->{$Path}}, $this->{$Current}; return $this->{$Current} = $newNode; } sub _NavigateNodeStirct { my ($this,$newNode) = @_; die new IMPL::InvalidOperationException("A newNode doesn't belongs to the current") unless $newNode->parentNode == $this->{$Current}; push @{$this->{$Path}}, $this->{$Current}; return $this->{$Current} = $newNode; } 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