Mercurial > pub > Impl
comparison lib/IMPL/Web/AutoLocator.pm @ 407:c6e90e02dd17 ref20150831
renamed Lib->lib
author | cin |
---|---|
date | Fri, 04 Sep 2015 19:40:23 +0300 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
406:f23fcb19d3c1 | 407:c6e90e02dd17 |
---|---|
1 package IMPL::Web::AutoLocator; | |
2 use strict; | |
3 | |
4 use overload '""' => 'toString'; | |
5 | |
6 use IMPL::Const qw(:prop); | |
7 use IMPL::lang qw(:hash); | |
8 use IMPL::clone qw(clone); | |
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' => '@_' | |
20 ], | |
21 props => [ | |
22 base => PROP_RO, | |
23 view => PROP_RW, | |
24 query => PROP_RW, | |
25 hash => PROP_RW | |
26 ] | |
27 }; | |
28 | |
29 sub Clone { | |
30 my $this = shift; | |
31 | |
32 return clone($this); | |
33 } | |
34 | |
35 sub Child { | |
36 my $this = shift; | |
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; | |
39 | |
40 # safe | |
41 #$child = uri_escape_utf8($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 | |
55 return $this->new(%args); | |
56 } | |
57 | |
58 sub Sibling { | |
59 my $this = shift; | |
60 my $child = shift or die ArgumentException->new("a child resource identifier is required"); | |
61 die ArgumentException->new("a child resource can't be a reference") if ref $child; | |
62 | |
63 # safe | |
64 #$child = uri_escape($child); | |
65 | |
66 my %args; | |
67 | |
68 if($this->base =~ /(.*?)(\/[^\/]*)?$/) { | |
69 $args{base} = join('/',$1,$child); | |
70 } else { | |
71 $args{base} = $child; | |
72 } | |
73 | |
74 $args{view} = $this->view if $this->view; | |
75 $args{hash} = $this->hash if $this->hash; | |
76 | |
77 if (@_) { | |
78 my $query = shift; | |
79 | |
80 $args{query} = ref $query eq 'HASH' ? hashMerge($this->query,$query) : $query; | |
81 } | |
82 | |
83 return $this->new(%args); | |
84 | |
85 } | |
86 | |
87 sub Query { | |
88 my ($this,$query) = @_; | |
89 | |
90 my %args; | |
91 | |
92 $args{base} = $this->base; | |
93 $args{view} = $this->view if $this->view; | |
94 $args{hash} = $this->hash if $this->hash; | |
95 $args{query} = ref $query eq 'HASH' ? hashMerge($this->query,$query) : $query; | |
96 | |
97 return $this->new(%args); | |
98 } | |
99 | |
100 sub SetView { | |
101 my ($this,$newView) = @_; | |
102 | |
103 $this->view($newView); | |
104 | |
105 return $this; | |
106 } | |
107 | |
108 sub url { | |
109 my ($this) = @_; | |
110 | |
111 my $url = URI->new($this->view ? $this->base . "." . $this->view : $this->base); | |
112 $url->query_form($this->query); | |
113 $url->fragment($this->hash); | |
114 | |
115 return $url; | |
116 } | |
117 | |
118 sub ToAbsolute { | |
119 my ($this,$baseUrl) = @_; | |
120 | |
121 return URI->new_abs( $this->url, $baseUrl ); | |
122 } | |
123 | |
124 sub toString { | |
125 shift->url->as_string(); | |
126 } | |
127 | |
128 sub AUTOLOAD { | |
129 our $AUTOLOAD; | |
130 | |
131 (my $method) = ($AUTOLOAD =~ m/(\w+)$/); | |
132 | |
133 return if $method eq 'DESTROY'; | |
134 | |
135 my $this = shift; | |
136 return $this->Child($method,@_); | |
137 } | |
138 | |
139 | |
140 | |
141 1; | |
142 | |
143 __END__ | |
144 | |
145 =head1 NAME | |
146 | |
147 C<IMPL::Web::AutoLocator> - Обертка вокруг адреса ресурса. | |
148 | |
149 =head1 SYNOPSIS | |
150 | |
151 =begin code | |
152 | |
153 use IMPL::require { | |
154 Locator => 'IMPL::Web::AutoLocator' | |
155 }; | |
156 | |
157 my $bugTracker = Locator->new(base => "http://myhost.org/bugzilla")->SetView("cgi"); | |
158 | |
159 my $bug = $bugTracker->show_bug({id = 1}); | |
160 | |
161 my $wikiPages = Locator->new(base => "http://myhost.org/wiki/bin/view"); | |
162 | |
163 my $page = $wiki->Main->HowTo; | |
164 | |
165 my $images = Locator->new(base => "http://static.myhost.org/images", view => "png"); | |
166 | |
167 my $editIco = $images->icons->small->edit; | |
168 | |
169 =end code | |
170 | |
171 =head1 DESCRIPTION | |
172 | |
173 Для удобстав навигации по ресурсам, полностью отражает классическую структуру | |
174 иерархически организованных ресурсов. позволяет гибко работать с параметрами | |
175 запроса и хешем. Для постоты чтения реализует метод C<AUTOLOAD> для доступа | |
176 к дочерним ресурсам. | |
177 | |
178 =head1 MEMBERS | |
179 | |
180 =head2 C<CTOR(%args)> | |
181 | |
182 Создает новый объект расположение. Позволяет задать путь, расширение, параметры | |
183 запроса и фрагмент ресурса. | |
184 | |
185 =over | |
186 | |
187 =item * C<base> | |
188 | |
189 Строка с базовым адресом для дочерних ресурсов. | |
190 | |
191 =item * C<view> | |
192 | |
193 Задает суфикс, обозначающий представление ресурса, аналогично расширению у | |
194 файлов. Данный суффикс может использоваться контроллером для выбора | |
195 представления ресурса. | |
196 | |
197 =item * C<query> | |
198 | |
199 Ссылка на хеш с параметрами запроса | |
200 | |
201 =item * C<hash> | |
202 | |
203 Часть C<uri> обозначающая фрагмент документа (все, что идет после символа C<#>). | |
204 | |
205 =back | |
206 | |
207 =head2 C<Child($child[,$query])> | |
208 | |
209 Получает расположение дочернего ресурса. При этом cоздается новый объект адреса ресурса. | |
210 | |
211 =head2 C<SetView($view)> | |
212 | |
213 Позволяет указать представление (расширение) у текущего адреса ресурса. Изменяет | |
214 представление и возвращает измененный адрес ресурса. | |
215 | |
216 =head2 C<[get]base> | |
217 | |
218 Базовый адрес, относительно которого будут получены дочерние ресурсы. | |
219 | |
220 =head2 C<[get,set]view> | |
221 | |
222 Представление для ресурсов, аналогично расширению у файлов. | |
223 | |
224 =head2 C<[get,set]query> | |
225 | |
226 Ссылка на хеш с параметрами для C<GET> запроса. | |
227 | |
228 =head2 C<[get,set]hash> | |
229 | |
230 Часть адреса ресурса, отвечающая за фрагмент. | |
231 | |
232 =head2 C<[get]url> | |
233 | |
234 Объект C<URI> для текущего адреса. | |
235 | |
236 =head2 C<AUTLOAD> | |
237 | |
238 Перенаправляет вызовы методов в метод C<Child> передавая первым параметром имя метода. | |
239 | |
240 =cut | |
241 |