Mercurial > pub > Impl
comparison Lib/IMPL/Web/AutoLocator.pm @ 229:47f77e6409f7
heavily reworked the resource model of the web application:
*some ResourcesContraact functionality moved to Resource
+Added CustomResource
*Corrected action handlers
| author | sergey |
|---|---|
| date | Sat, 29 Sep 2012 02:34:47 +0400 |
| parents | 292226770180 |
| children | 5c82eec23bb6 |
comparison
equal
deleted
inserted
replaced
| 228:431db7034a88 | 229:47f77e6409f7 |
|---|---|
| 1 package IMPL::Web::AutoLocator; | 1 package IMPL::Web::AutoLocator; |
| 2 use strict; | 2 use strict; |
| 3 | 3 |
| 4 use IMPL::lang qw(:declare :constants :hash); | 4 use IMPL::lang qw(:constants :hash); |
| 5 use URI; | 5 use URI; |
| 6 use URI::Escape; | 6 use URI::Escape; |
| 7 use IMPL::declare { | 7 use IMPL::declare { |
| 8 require => { | 8 require => { |
| 9 Exception => 'IMPL::Exception', | 9 Exception => 'IMPL::Exception', |
| 11 }, | 11 }, |
| 12 base => [ | 12 base => [ |
| 13 'IMPL::Object' => undef, | 13 'IMPL::Object' => undef, |
| 14 'IMPL::Object::Autofill' => '@_', | 14 'IMPL::Object::Autofill' => '@_', |
| 15 'IMPL::Object::Serializable' => '@_' | 15 'IMPL::Object::Serializable' => '@_' |
| 16 ], | |
| 17 props => [ | |
| 18 base => PROP_GET | PROP_OWNERSET, | |
| 19 view => PROP_ALL, | |
| 20 query => PROP_ALL, | |
| 21 hash => PROP_ALL | |
| 16 ] | 22 ] |
| 17 }; | 23 }; |
| 18 | 24 |
| 19 BEGIN { | 25 sub Child { |
| 20 public property base => PROP_GET | PROP_OWNERSET; | |
| 21 public property view => PROP_ALL; | |
| 22 public property query => PROP_ALL; | |
| 23 public property hash => PROP_ALL; | |
| 24 } | |
| 25 | |
| 26 sub Fetch { | |
| 27 my $this = shift; | 26 my $this = shift; |
| 28 my $child = shift or die ArgumentException->new("a child resource identifier is required"); | 27 my $child = shift or die ArgumentException->new("a child resource identifier is required"); |
| 29 die ArgumentException->new("a child resource can't be a reference") if ref $child; | 28 die ArgumentException->new("a child resource can't be a reference") if ref $child; |
| 30 | 29 |
| 31 # safe | 30 # safe |
| 70 (my $method) = ($AUTOLOAD =~ m/(\w+)$/); | 69 (my $method) = ($AUTOLOAD =~ m/(\w+)$/); |
| 71 | 70 |
| 72 return if $method eq 'DESTROY'; | 71 return if $method eq 'DESTROY'; |
| 73 | 72 |
| 74 my $this = shift; | 73 my $this = shift; |
| 75 return $this->Fetch($method,@_); | 74 return $this->Child($method,@_); |
| 76 } | 75 } |
| 77 | 76 |
| 78 | 77 |
| 79 | 78 |
| 80 1; | 79 1; |
| 81 | 80 |
| 82 __END__ | 81 __END__ |
| 83 | 82 |
| 84 =head1 NAME | 83 =head1 NAME |
| 85 | 84 |
| 85 C<IMPL::Web::AutoLocator> - Обертка вокруг адреса ресурса. | |
| 86 | |
| 86 =head1 SYNOPSIS | 87 =head1 SYNOPSIS |
| 87 | |
| 88 C<IMPL::Web::AutoLocator> - Обертка вокруг адреса ресурса. | |
| 89 | 88 |
| 90 =begin code | 89 =begin code |
| 91 | 90 |
| 92 use IMPL::require { | 91 use IMPL::require { |
| 93 Locator => 'IMPL::Web::Locator' | 92 Locator => 'IMPL::Web::AutoLocator' |
| 94 }; | 93 }; |
| 95 | 94 |
| 96 my $bugTracker = Locator->new(base => "http://myhost.org/bugzilla")->SetView("cgi"); | 95 my $bugTracker = Locator->new(base => "http://myhost.org/bugzilla")->SetView("cgi"); |
| 97 | 96 |
| 98 my $bug = $bugTracker->show_bug({id = 1}); | 97 my $bug = $bugTracker->show_bug({id = 1}); |
| 99 | 98 |
| 100 my $wikiPages = Locator->new(base => "http://myhost.org/wiki/bin/view"); | 99 my $wikiPages = Locator->new(base => "http://myhost.org/wiki/bin/view"); |
| 101 | 100 |
| 102 my $page = $wiki->Main->HowTo; | 101 my $page = $wiki->Main->HowTo; |
| 103 | 102 |
| 103 my $images = Locator->new(base => "http://static.myhost.org/images", view => "png"); | |
| 104 | |
| 105 my $editIco = $images->icons->small->edit; | |
| 106 | |
| 104 =end code | 107 =end code |
| 105 | 108 |
| 106 =head1 DESCRIPTION | 109 =head1 DESCRIPTION |
| 107 | 110 |
| 108 Для удобстав навигации по ресурсам, полностью отражает классическую структуру иерархически | 111 Для удобстав навигации по ресурсам, полностью отражает классическую структуру |
| 109 организованных ресурсов. позволяет гибко работать с параметрами запроса и хешем. Для постоты | 112 иерархически организованных ресурсов. позволяет гибко работать с параметрами |
| 110 чтения реализует метод C<AUTOLOAD> для доступа к дочерним ресурсам. | 113 запроса и хешем. Для постоты чтения реализует метод C<AUTOLOAD> для доступа |
| 114 к дочерним ресурсам. | |
| 111 | 115 |
| 112 =head1 MEMBERS | 116 =head1 MEMBERS |
| 113 | 117 |
| 114 =head2 C<CTOR(base => $url,view => $extension, query => $hashQuery, hash => $fragment)> | 118 =head2 C<CTOR(%args)> |
| 115 | 119 |
| 116 Создает новый объект расположение. Позволяет задать путь, расширение, параметры запроса и фрагмент ресурса. | 120 Создает новый объект расположение. Позволяет задать путь, расширение, параметры |
| 121 запроса и фрагмент ресурса. | |
| 117 | 122 |
| 118 =head2 C<Fetch($child[,$query])> | 123 =over |
| 119 | 124 |
| 120 Получает расположение дочернего ресурса. При этом моздается новый объект адреса ресурса. | 125 =item * C<base> |
| 126 | |
| 127 Строка с базовым адресом для дочерних ресурсов. | |
| 128 | |
| 129 =item * C<view> | |
| 130 | |
| 131 Задает суфикс, обозначающий представление ресурса, аналогично расширению у | |
| 132 файлов. Данный суффикс может использоваться контроллером для выбора | |
| 133 представления ресурса. | |
| 134 | |
| 135 =item * C<query> | |
| 136 | |
| 137 Ссылка на хеш с параметрами запроса | |
| 138 | |
| 139 =item * C<hash> | |
| 140 | |
| 141 Часть C<uri> обозначающая фрагмент документа (все, что идет после символа C<#>). | |
| 142 | |
| 143 =back | |
| 144 | |
| 145 =head2 C<Child($child[,$query])> | |
| 146 | |
| 147 Получает расположение дочернего ресурса. При этом cоздается новый объект адреса ресурса. | |
| 148 | |
| 149 =head2 C<SetView($view)> | |
| 150 | |
| 151 Позволяет указать представление (расширение) у текущего адреса ресурса. Изменяет | |
| 152 представление и возвращает измененный адрес ресурса. | |
| 153 | |
| 154 =head2 C<[get]base> | |
| 155 | |
| 156 Базовый адрес, относительно которого будут получены дочерние ресурсы. | |
| 157 | |
| 158 =head2 C<[get,set]view> | |
| 159 | |
| 160 Представление для ресурсов, аналогично расширению у файлов. | |
| 161 | |
| 162 =head2 C<[get,set]query> | |
| 163 | |
| 164 Ссылка на хеш с параметрами для C<GET> запроса. | |
| 165 | |
| 166 =head2 C<[get,set]hash> | |
| 167 | |
| 168 Часть адреса ресурса, отвечающая за фрагмент. | |
| 169 | |
| 170 =head2 C<[get]url> | |
| 171 | |
| 172 Объект C<URI> для текущего адреса. | |
| 121 | 173 |
| 122 =head2 C<AUTLOAD> | 174 =head2 C<AUTLOAD> |
| 123 | 175 |
| 124 Перенаправляет вызовы методов в метод C<Fetch> передавая первым параметром имя метода. | 176 Перенаправляет вызовы методов в метод C<Child> передавая первым параметром имя метода. |
| 125 | 177 |
| 126 =cut | 178 =cut |
| 127 | 179 |
