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