comparison Lib/IMPL/Web/Application/CustomResourceContract.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
children 6d8092d8ce1b
comparison
equal deleted inserted replaced
228:431db7034a88 229:47f77e6409f7
1 package IMPL::Web::Application::CustomResourceContract;
2 use strict;
3
4 use IMPL::lang qw(:constants);
5 use IMPL::declare {
6 require => {
7 NotAllowedException => 'IMPL::Web::NotAllowedException',
8 OperationContract => 'IMPL::Web::Application::OperationContract'
9 },
10 base => [
11 'IMPL::Web::Application::ResourceContract' => '@_'
12 ]
13 };
14
15 our %RESOURCE_BINDINGS = (
16 GET => 'HttpGet',
17 POST => 'HttpPost',
18 PUT => 'HttpPut'
19 DELETE => 'HttpDelete',
20 HEAD => 'HttpHead'
21 );
22
23 sub CTOR {
24 my ($this) = @_;
25
26 $this->verbs->{options} = OperationContract->new( binding => \&_HttpOptionsBinding );
27
28 while(my ($verb,$methodName) = each %RESOURCE_BINDINGS) {
29 $this->verbs->{lc($verb)} = OperationContract->new (
30 binding => sub {
31 my ($resource,$action) = @_;
32
33 if ($resource->can($methodName)) {
34 return $resource->$methodName($action);
35 } else {
36 die NotAllowedException->new(allow => join(',', _GetAllowedHttpMethods($resource)));
37 }
38
39 }
40 );
41 }
42 }
43
44 sub _HttpOptionsBinding {
45 my ($resource) = @_;
46
47 my @allow = _GetAllowedHttpMethods;
48 retrun HttpResponse->new(
49 status => '200 OK',
50 headers => {
51 allow => join ( ',', @allow )
52 }
53 );
54 }
55
56 sub _GetAllowedHttpMethods {
57 my ($resource) = @_;
58 return grep $resource->can($RESOURCE_BINDINGS{$_}), values %RESOURCE_BINDINGS;
59 }
60
61 1;
62
63 __END__
64
65 =pod
66
67 =head1 NAME
68
69 C<IMPL::Web::Application::CustomResourceContract> - контракт для веб-ресурсов,
70 реальзуемых в коде см. C<IMPL::Web::Application::CustomResource}>.
71
72 =head1 DESCRIPTION
73
74 Данный класс не используется напрямую.
75
76 =cut