Mercurial > pub > Impl
comparison 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 |
comparison
equal
deleted
inserted
replaced
209:a8db61d0ed33 | 210:6adaeb86945d |
---|---|
1 package IMPL::Web::AutoLocator; | |
2 use strict; | |
3 | |
4 use IMPL::lang qw(:declare :constants :hash); | |
5 use URI; | |
6 use URI::Escape; | |
7 use IMPL::declare { | |
8 require => { | |
9 Exception => 'IMPL::Exception', | |
10 ArgumentException => '-IMPL::InvalidArgumentException' | |
11 }, | |
12 base => [ | |
13 'IMPL::Object' => undef, | |
14 'IMPL::Object::Autofill' => '@_', | |
15 'IMPL::Object::Serializable' => '@_' | |
16 ] | |
17 }; | |
18 | |
19 BEGIN { | |
20 public property base => PROP_GET | PROP_OWNERSET; | |
21 public property view => PROP_ALL; | |
22 public property query => PROP_ALL; | |
23 public property hash => RPOP_ALL; | |
24 } | |
25 | |
26 sub fetch { | |
27 my $this = shift; | |
28 my $child = shift or die ArgumentException->new(child => "a child resource identifier is required"); | |
29 die ArgumentException->new(child => "a child resource can't be a reference"); | |
30 | |
31 # safe | |
32 $child = uri_escape($child); | |
33 | |
34 my %args; | |
35 | |
36 $args{base} = $this->base =~ /\/$/ ? $this->base . $child : $this->base . '/' . $child; | |
37 $args{view} = $this->view if $this->view; | |
38 $args{hash} = $this->hash if $this->hash; | |
39 | |
40 if (@_) { | |
41 my $query = shift; | |
42 | |
43 $args{query} = ref $query eq 'HASH' ? hashMerge($this->query,$query) : $query; | |
44 } | |
45 | |
46 return __PACKAGE__->new() | |
47 } | |
48 | |
49 | |
50 | |
51 1; | |
52 | |
53 __END__ | |
54 | |
55 =head1 NAME | |
56 | |
57 =head1 SYNOPSIS | |
58 | |
59 C<IMPL::Web::AutoLocator> - Обертка вокруг адреса ресурса. | |
60 | |
61 =begin code | |
62 | |
63 use IMPL::require { | |
64 Locator => 'IMPL::Web::Locator' | |
65 }; | |
66 | |
67 my $bugTracker = Locator->new("http://myhost.org/bugzilla")->view("cgi"); | |
68 | |
69 my $bug = $bugTracker->show_bug({id = 1}); | |
70 | |
71 my $wikiPages = Locator->new("http://myhost.org/wiki/bin/view"); | |
72 | |
73 my $page = $wiki->Main->HowTo; | |
74 | |
75 =end code | |
76 | |
77 =head1 DESCRIPTION | |
78 | |
79 Для удобстав навигации по ресурсам, полностью отражает классическую структуру иерархически | |
80 организованных ресурсов. позволяет гибко работать с параметрами запроса и хешем. Для постоты | |
81 чтения реализует метод C<AUTOLOAD> для доступа к дочерним ресурсам |