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