view Lib/IMPL/Web/AutoLocator.pm @ 245:7c517134c42f

Added Unsupported media type Web exception corrected resourceLocation setting in the resource Implemented localizable resources for text messages fixed TT view scopings, INIT block in controls now sets globals correctly.
author sergey
date Mon, 29 Oct 2012 03:15:22 +0400
parents a02b110da931
children 32aceba4ee6d
line wrap: on
line source

package IMPL::Web::AutoLocator;
use strict;

use overload '""' => 'toString';

use IMPL::Const qw(:prop);
use IMPL::lang qw(:hash);
use IMPL::clone qw(clone);
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 Clone {
    my $this = shift;
    
    return clone($this);
}

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 toString {
    shift->url->as_string();
}

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