Mercurial > pub > Impl
view Lib/IMPL/Web/AutoLocator.pm @ 243:cd2b1f121029
*TTView: fixed template selection based on the model type
author | sergey |
---|---|
date | Fri, 19 Oct 2012 02:23:15 +0400 |
parents | 5c82eec23bb6 |
children | a02b110da931 |
line wrap: on
line source
package IMPL::Web::AutoLocator; use strict; use IMPL::Const qw(:prop); use IMPL::lang qw( :hash ); use URI; use URI::Escape; use IMPL::declare { require => { Exception => 'IMPL::Exception', ArgumentException => '-IMPL::InvalidArgumentException' }, base => [ 'IMPL::Object' => undef, 'IMPL::Object::Autofill' => '@_', 'IMPL::Object::Serializable' => '@_' ], props => [ base => PROP_RO, view => PROP_RW, query => PROP_RW, hash => PROP_RW ] }; sub Child { my $this = shift; my $child = shift or die ArgumentException->new("a child resource identifier is required"); die ArgumentException->new("a child resource can't be a reference") if ref $child; # safe $child = uri_escape($child); my %args; $args{base} = $this->base =~ /\/$/ ? $this->base . $child : $this->base . '/' . $child; $args{view} = $this->view if $this->view; $args{hash} = $this->hash if $this->hash; if (@_) { my $query = shift; $args{query} = ref $query eq 'HASH' ? hashMerge($this->query,$query) : $query; } return $this->new(%args); } sub SetView { my ($this,$newView) = @_; $this->view($newView); return $this; } sub url { my ($this) = @_; my $url = URI->new($this->view ? $this->base . "." . $this->view : $this->base); $url->query_form($this->query); $url->fragment($this->hash); return $url; } sub AUTOLOAD { our $AUTOLOAD; (my $method) = ($AUTOLOAD =~ m/(\w+)$/); return if $method eq 'DESTROY'; my $this = shift; return $this->Child($method,@_); } 1; __END__ =head1 NAME C<IMPL::Web::AutoLocator> - Обертка вокруг адреса ресурса. =head1 SYNOPSIS =begin code use IMPL::require { Locator => 'IMPL::Web::AutoLocator' }; my $bugTracker = Locator->new(base => "http://myhost.org/bugzilla")->SetView("cgi"); my $bug = $bugTracker->show_bug({id = 1}); my $wikiPages = Locator->new(base => "http://myhost.org/wiki/bin/view"); my $page = $wiki->Main->HowTo; my $images = Locator->new(base => "http://static.myhost.org/images", view => "png"); my $editIco = $images->icons->small->edit; =end code =head1 DESCRIPTION Для удобстав навигации по ресурсам, полностью отражает классическую структуру иерархически организованных ресурсов. позволяет гибко работать с параметрами запроса и хешем. Для постоты чтения реализует метод C<AUTOLOAD> для доступа к дочерним ресурсам. =head1 MEMBERS =head2 C<CTOR(%args)> Создает новый объект расположение. Позволяет задать путь, расширение, параметры запроса и фрагмент ресурса. =over =item * C<base> Строка с базовым адресом для дочерних ресурсов. =item * C<view> Задает суфикс, обозначающий представление ресурса, аналогично расширению у файлов. Данный суффикс может использоваться контроллером для выбора представления ресурса. =item * C<query> Ссылка на хеш с параметрами запроса =item * C<hash> Часть C<uri> обозначающая фрагмент документа (все, что идет после символа C<#>). =back =head2 C<Child($child[,$query])> Получает расположение дочернего ресурса. При этом cоздается новый объект адреса ресурса. =head2 C<SetView($view)> Позволяет указать представление (расширение) у текущего адреса ресурса. Изменяет представление и возвращает измененный адрес ресурса. =head2 C<[get]base> Базовый адрес, относительно которого будут получены дочерние ресурсы. =head2 C<[get,set]view> Представление для ресурсов, аналогично расширению у файлов. =head2 C<[get,set]query> Ссылка на хеш с параметрами для C<GET> запроса. =head2 C<[get,set]hash> Часть адреса ресурса, отвечающая за фрагмент. =head2 C<[get]url> Объект C<URI> для текущего адреса. =head2 C<AUTLOAD> Перенаправляет вызовы методов в метод C<Child> передавая первым параметром имя метода. =cut