view Lib/IMPL/Web/AutoLocator.pm @ 210:6adaeb86945d

added IMPL::Web::AutoLocator
author sergey
date Tue, 29 May 2012 20:07:22 +0400
parents
children 2b9b55cfb79b
line wrap: on
line source

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

use IMPL::lang qw(:declare :constants :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' => '@_'
	]
};

BEGIN {
	public property base => PROP_GET | PROP_OWNERSET;
	public property view => PROP_ALL;
	public property query => PROP_ALL;
	public property hash => RPOP_ALL;
}

sub fetch {
	my $this = shift;
	my $child = shift or die ArgumentException->new(child => "a child resource identifier is required");
	die ArgumentException->new(child => "a child resource can't be a reference");
	
	# 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 __PACKAGE__->new()
}



1;

__END__

=head1 NAME

=head1 SYNOPSIS

C<IMPL::Web::AutoLocator> - Обертка вокруг адреса ресурса.

=begin code

use IMPL::require {
	Locator => 'IMPL::Web::Locator'
};

my $bugTracker = Locator->new("http://myhost.org/bugzilla")->view("cgi");

my $bug = $bugTracker->show_bug({id = 1});

my $wikiPages = Locator->new("http://myhost.org/wiki/bin/view");

my $page = $wiki->Main->HowTo;

=end code

=head1 DESCRIPTION

Для удобстав навигации по ресурсам, полностью отражает классическую структуру иерархически
организованных ресурсов. позволяет гибко работать с параметрами запроса и хешем. Для постоты
чтения реализует метод C<AUTOLOAD> для доступа к дочерним ресурсам