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 |
