Mercurial > pub > Impl
annotate Lib/IMPL/Web/AutoLocator.pm @ 302:673581380e79
Added templates provider functionality to controls
minor fixes
| author | cin |
|---|---|
| date | Mon, 01 Apr 2013 00:41:48 +0400 |
| parents | 6dc1c369eb71 |
| children | 793cc7f0a7e7 |
| 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 | |
| 292 | 58 sub Query { |
| 59 my ($this,$query) = @_; | |
| 60 | |
| 61 my %args; | |
| 62 | |
| 63 $args{base} = $this->base; | |
| 64 $args{view} = $this->view if $this->view; | |
| 65 $args{hash} = $this->hash if $this->hash; | |
| 66 $args{query} = ref $query eq 'HASH' ? hashMerge($this->query,$query) : $query; | |
| 67 | |
| 68 return $this->new(%args); | |
| 69 } | |
| 70 | |
| 211 | 71 sub SetView { |
| 72 my ($this,$newView) = @_; | |
| 73 | |
| 74 $this->view($newView); | |
| 75 | |
| 76 return $this; | |
| 77 } | |
| 78 | |
| 79 sub url { | |
| 80 my ($this) = @_; | |
| 81 | |
| 82 my $url = URI->new($this->view ? $this->base . "." . $this->view : $this->base); | |
| 83 $url->query_form($this->query); | |
| 84 $url->fragment($this->hash); | |
| 85 | |
| 86 return $url; | |
| 87 } | |
| 88 | |
|
256
32aceba4ee6d
corrected ViewHandlers to handle cookies and headers.
sergey
parents:
244
diff
changeset
|
89 sub ToAbsolute { |
|
32aceba4ee6d
corrected ViewHandlers to handle cookies and headers.
sergey
parents:
244
diff
changeset
|
90 my ($this,$baseUrl) = @_; |
|
32aceba4ee6d
corrected ViewHandlers to handle cookies and headers.
sergey
parents:
244
diff
changeset
|
91 |
|
32aceba4ee6d
corrected ViewHandlers to handle cookies and headers.
sergey
parents:
244
diff
changeset
|
92 return URI->new_abs( $this->url, $baseUrl ); |
|
32aceba4ee6d
corrected ViewHandlers to handle cookies and headers.
sergey
parents:
244
diff
changeset
|
93 } |
|
32aceba4ee6d
corrected ViewHandlers to handle cookies and headers.
sergey
parents:
244
diff
changeset
|
94 |
| 244 | 95 sub toString { |
| 96 shift->url->as_string(); | |
| 97 } | |
| 98 | |
| 211 | 99 sub AUTOLOAD { |
| 100 our $AUTOLOAD; | |
| 101 | |
| 102 (my $method) = ($AUTOLOAD =~ m/(\w+)$/); | |
| 103 | |
| 104 return if $method eq 'DESTROY'; | |
| 105 | |
| 106 my $this = shift; | |
|
229
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
107 return $this->Child($method,@_); |
| 210 | 108 } |
| 109 | |
| 110 | |
| 111 | |
| 112 1; | |
| 113 | |
| 114 __END__ | |
| 115 | |
| 116 =head1 NAME | |
| 117 | |
|
229
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
118 C<IMPL::Web::AutoLocator> - Обертка вокруг адреса ресурса. |
| 210 | 119 |
|
229
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
120 =head1 SYNOPSIS |
| 210 | 121 |
| 122 =begin code | |
| 123 | |
| 124 use IMPL::require { | |
|
229
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
125 Locator => 'IMPL::Web::AutoLocator' |
| 210 | 126 }; |
| 127 | |
| 212 | 128 my $bugTracker = Locator->new(base => "http://myhost.org/bugzilla")->SetView("cgi"); |
| 210 | 129 |
| 130 my $bug = $bugTracker->show_bug({id = 1}); | |
| 131 | |
| 212 | 132 my $wikiPages = Locator->new(base => "http://myhost.org/wiki/bin/view"); |
| 210 | 133 |
| 134 my $page = $wiki->Main->HowTo; | |
| 135 | |
|
229
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
136 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
|
137 |
|
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
138 my $editIco = $images->icons->small->edit; |
|
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
139 |
| 210 | 140 =end code |
| 141 | |
| 142 =head1 DESCRIPTION | |
| 143 | |
|
229
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
144 Для удобстав навигации по ресурсам, полностью отражает классическую структуру |
|
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 запроса и хешем. Для постоты чтения реализует метод C<AUTOLOAD> для доступа |
|
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
147 к дочерним ресурсам. |
| 211 | 148 |
| 149 =head1 MEMBERS | |
| 150 | |
|
229
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
151 =head2 C<CTOR(%args)> |
|
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 Создает новый объект расположение. Позволяет задать путь, расширение, параметры |
|
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 |
|
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
156 =over |
|
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
157 |
|
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
158 =item * C<base> |
|
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
159 |
|
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 |
|
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
162 =item * C<view> |
| 211 | 163 |
|
229
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 =item * C<query> |
|
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 Ссылка на хеш с параметрами запроса |
|
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
171 |
|
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
172 =item * C<hash> |
|
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 Часть C<uri> обозначающая фрагмент документа (все, что идет после символа C<#>). |
|
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 =back |
| 211 | 177 |
|
229
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
178 =head2 C<Child($child[,$query])> |
|
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 Получает расположение дочернего ресурса. При этом cоздается новый объект адреса ресурса. |
|
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 =head2 C<SetView($view)> |
|
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 Позволяет указать представление (расширение) у текущего адреса ресурса. Изменяет |
|
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 |
|
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
187 =head2 C<[get]base> |
|
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
188 |
|
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
189 Базовый адрес, относительно которого будут получены дочерние ресурсы. |
| 211 | 190 |
|
229
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
191 =head2 C<[get,set]view> |
|
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
192 |
|
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
193 Представление для ресурсов, аналогично расширению у файлов. |
|
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
194 |
|
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
195 =head2 C<[get,set]query> |
|
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
196 |
|
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
197 Ссылка на хеш с параметрами для C<GET> запроса. |
|
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
198 |
|
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
199 =head2 C<[get,set]hash> |
|
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
200 |
|
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
201 Часть адреса ресурса, отвечающая за фрагмент. |
|
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
202 |
|
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
203 =head2 C<[get]url> |
|
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
204 |
|
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
205 Объект C<URI> для текущего адреса. |
| 211 | 206 |
| 207 =head2 C<AUTLOAD> | |
| 208 | |
|
229
47f77e6409f7
heavily reworked the resource model of the web application:
sergey
parents:
212
diff
changeset
|
209 Перенаправляет вызовы методов в метод C<Child> передавая первым параметром имя метода. |
| 212 | 210 |
| 211 =cut | |
| 212 |
