Mercurial > pub > Impl
annotate 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 |
rev | line source |
---|---|
210 | 1 package IMPL::Web::AutoLocator; |
2 use strict; | |
3 | |
244 | 4 use overload '""' => 'toString'; |
5 | |
232 | 6 use IMPL::Const qw(:prop); |
244 | 7 use IMPL::lang qw(:hash); |
8 use IMPL::clone qw(clone); | |
210 | 9 use URI; |
10 use URI::Escape; | |
11 use IMPL::declare { | |
12 require => { | |
13 Exception => 'IMPL::Exception', | |
14 ArgumentException => '-IMPL::InvalidArgumentException' | |
15 }, | |
16 base => [ | |
17 'IMPL::Object' => undef, | |
18 'IMPL::Object::Autofill' => '@_', | |
19 'IMPL::Object::Serializable' => '@_' | |
229
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
20 ], |
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
21 props => [ |
232 | 22 base => PROP_RO, |
23 view => PROP_RW, | |
24 query => PROP_RW, | |
25 hash => PROP_RW | |
210 | 26 ] |
27 }; | |
28 | |
244 | 29 sub Clone { |
30 my $this = shift; | |
31 | |
32 return clone($this); | |
33 } | |
34 | |
229
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
35 sub Child { |
210 | 36 my $this = shift; |
211 | 37 my $child = shift or die ArgumentException->new("a child resource identifier is required"); |
38 die ArgumentException->new("a child resource can't be a reference") if ref $child; | |
210 | 39 |
40 # safe | |
41 $child = uri_escape($child); | |
42 | |
43 my %args; | |
44 | |
45 $args{base} = $this->base =~ /\/$/ ? $this->base . $child : $this->base . '/' . $child; | |
46 $args{view} = $this->view if $this->view; | |
47 $args{hash} = $this->hash if $this->hash; | |
48 | |
49 if (@_) { | |
50 my $query = shift; | |
51 | |
52 $args{query} = ref $query eq 'HASH' ? hashMerge($this->query,$query) : $query; | |
53 } | |
54 | |
212 | 55 return $this->new(%args); |
211 | 56 } |
57 | |
58 sub SetView { | |
59 my ($this,$newView) = @_; | |
60 | |
61 $this->view($newView); | |
62 | |
63 return $this; | |
64 } | |
65 | |
66 sub url { | |
67 my ($this) = @_; | |
68 | |
69 my $url = URI->new($this->view ? $this->base . "." . $this->view : $this->base); | |
70 $url->query_form($this->query); | |
71 $url->fragment($this->hash); | |
72 | |
73 return $url; | |
74 } | |
75 | |
244 | 76 sub toString { |
77 shift->url->as_string(); | |
78 } | |
79 | |
211 | 80 sub AUTOLOAD { |
81 our $AUTOLOAD; | |
82 | |
83 (my $method) = ($AUTOLOAD =~ m/(\w+)$/); | |
84 | |
85 return if $method eq 'DESTROY'; | |
86 | |
87 my $this = shift; | |
229
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
88 return $this->Child($method,@_); |
210 | 89 } |
90 | |
91 | |
92 | |
93 1; | |
94 | |
95 __END__ | |
96 | |
97 =head1 NAME | |
98 | |
229
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
99 C<IMPL::Web::AutoLocator> - Обертка вокруг адреса ресурса. |
210 | 100 |
229
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
101 =head1 SYNOPSIS |
210 | 102 |
103 =begin code | |
104 | |
105 use IMPL::require { | |
229
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
106 Locator => 'IMPL::Web::AutoLocator' |
210 | 107 }; |
108 | |
212 | 109 my $bugTracker = Locator->new(base => "http://myhost.org/bugzilla")->SetView("cgi"); |
210 | 110 |
111 my $bug = $bugTracker->show_bug({id = 1}); | |
112 | |
212 | 113 my $wikiPages = Locator->new(base => "http://myhost.org/wiki/bin/view"); |
210 | 114 |
115 my $page = $wiki->Main->HowTo; | |
116 | |
229
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
117 my $images = Locator->new(base => "http://static.myhost.org/images", view => "png"); |
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
118 |
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
119 my $editIco = $images->icons->small->edit; |
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
120 |
210 | 121 =end code |
122 | |
123 =head1 DESCRIPTION | |
124 | |
229
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
125 Для удобстав навигации по ресурсам, полностью отражает классическую структуру |
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
126 иерархически организованных ресурсов. позволяет гибко работать с параметрами |
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
127 запроса и хешем. Для постоты чтения реализует метод C<AUTOLOAD> для доступа |
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
128 к дочерним ресурсам. |
211 | 129 |
130 =head1 MEMBERS | |
131 | |
229
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
132 =head2 C<CTOR(%args)> |
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
133 |
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
134 Создает новый объект расположение. Позволяет задать путь, расширение, параметры |
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
135 запроса и фрагмент ресурса. |
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
136 |
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
137 =over |
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
138 |
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
139 =item * C<base> |
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
140 |
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
141 Строка с базовым адресом для дочерних ресурсов. |
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
142 |
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
143 =item * C<view> |
211 | 144 |
229
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
145 Задает суфикс, обозначающий представление ресурса, аналогично расширению у |
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
146 файлов. Данный суффикс может использоваться контроллером для выбора |
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
147 представления ресурса. |
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
148 |
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
149 =item * C<query> |
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
150 |
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
151 Ссылка на хеш с параметрами запроса |
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
152 |
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
153 =item * C<hash> |
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
154 |
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
155 Часть C<uri> обозначающая фрагмент документа (все, что идет после символа C<#>). |
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
156 |
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
157 =back |
211 | 158 |
229
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
159 =head2 C<Child($child[,$query])> |
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
160 |
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
161 Получает расположение дочернего ресурса. При этом cоздается новый объект адреса ресурса. |
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
162 |
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
163 =head2 C<SetView($view)> |
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
164 |
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
165 Позволяет указать представление (расширение) у текущего адреса ресурса. Изменяет |
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
166 представление и возвращает измененный адрес ресурса. |
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
167 |
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
168 =head2 C<[get]base> |
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
169 |
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
170 Базовый адрес, относительно которого будут получены дочерние ресурсы. |
211 | 171 |
229
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
172 =head2 C<[get,set]view> |
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
173 |
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
174 Представление для ресурсов, аналогично расширению у файлов. |
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
175 |
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
176 =head2 C<[get,set]query> |
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
177 |
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
178 Ссылка на хеш с параметрами для C<GET> запроса. |
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
179 |
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
180 =head2 C<[get,set]hash> |
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
181 |
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
182 Часть адреса ресурса, отвечающая за фрагмент. |
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
183 |
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
184 =head2 C<[get]url> |
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
185 |
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
186 Объект C<URI> для текущего адреса. |
211 | 187 |
188 =head2 C<AUTLOAD> | |
189 | |
229
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
190 Перенаправляет вызовы методов в метод C<Child> передавая первым параметром имя метода. |
212 | 191 |
192 =cut | |
193 |