Mercurial > pub > Impl
comparison Lib/IMPL/Web/Application/ResourceContract.pm @ 228:431db7034a88
Для синхронизации
author | andrei <andrei@nap21.upri> |
---|---|
date | Thu, 13 Sep 2012 17:55:01 +0400 |
parents | 70ad6bc20908 |
children | 47f77e6409f7 |
comparison
equal
deleted
inserted
replaced
227:70ad6bc20908 | 228:431db7034a88 |
---|---|
1 package IMPL::Web::Application::ResourceContract; | 1 package IMPL::Web::Application::ResourceContract; |
2 use strict; | 2 use strict; |
3 use IMPL::lang qw(:declare); | 3 use IMPL::lang qw(:declare); |
4 use IMPL::declare { | 4 use IMPL::declare { |
5 require => { | 5 require => { |
6 'Exception' => 'IMPL::Exception', | |
7 'ArgumentException' => '-IMPL::ArgumentException', | |
8 'KeyNotFoundException' => '-IMPL::KeyNotFoundException', | |
6 'ResourceClass' => 'IMPL::Web::Application::Resource' | 9 'ResourceClass' => 'IMPL::Web::Application::Resource' |
7 }, | 10 }, |
8 base => [ | 11 base => [ |
9 'IMPL::Object' => undef | 12 'IMPL::Object' => undef |
10 ] | 13 ] |
12 | 15 |
13 BEGIN { | 16 BEGIN { |
14 public property resourceFactory => PROP_ALL; | 17 public property resourceFactory => PROP_ALL; |
15 public property operations => PROP_ALL; | 18 public property operations => PROP_ALL; |
16 private property _namedResources => PROP_ALL; | 19 private property _namedResources => PROP_ALL; |
17 private property _regexpResources => PROP_ALL; | 20 private property _regexpResources => PROP_ALL | PROP_LIST; |
18 } | 21 } |
19 | 22 |
20 sub CTOR { | 23 sub CTOR { |
21 my $this = shift; | 24 my $this = shift; |
22 my %args = @_; | 25 my %args = @_; |
23 | 26 |
24 $this->resourceFactory( $args{resourceFactory} || ResourceClass ); | 27 $this->resourceFactory( $args{resourceFactory} || ResourceClass ); |
28 | |
29 my $resources = $args{resources} || []; | |
30 my $operations = $args{operations} || {}; | |
31 | |
32 die ArgumentException->new(resources => 'resources parameter must be a reference to an array') | |
33 unless ref $resources eq 'ARRAY'; | |
34 | |
35 die ArgumentException->new(opearations => 'operations parameter must be a reference to a hash') | |
36 unless ref $operations eq 'HASH'; | |
37 | |
38 my %nameMap; | |
39 | |
40 foreach my $res (@$resources) { | |
41 next unless $res->{contract}; | |
42 if(my $name = $res->{name}) { | |
43 $nameMap{$name} = $res; | |
44 } | |
45 if($res->{match}) { | |
46 $this->_regexpResources->Append($res); | |
47 } | |
48 } | |
49 | |
50 $this->_namedResources(\%nameMap); | |
25 } | 51 } |
26 | 52 |
27 sub CreateResource { | 53 sub CreateResource { |
28 my ($this,) | 54 my $this = shift; |
55 my %args = @_; | |
56 | |
57 return $this->resourceFactory->new ( | |
58 %args, | |
59 contract => $this | |
60 ); | |
61 } | |
62 | |
63 sub FindChildResourceContractInfo { | |
64 my ($this,$name) = @_; | |
65 | |
66 if(my $contract = $this->_namedResources->{$name}) { | |
67 return $contract; | |
68 } else { | |
69 foreach my $info ( $this->_regexpResources ) { | |
70 my $rx = $info->{match}; | |
71 return $info if $name =~ m/$rx/; | |
72 } | |
73 } | |
74 | |
75 return undef; | |
76 } | |
77 | |
78 sub CreateChildResource { | |
79 my $this = @_; | |
80 my %args = @_; | |
81 | |
82 my $id = $args{id} or die ArgumentException( id => 'id parameter must be specified'); | |
83 my $parent = $args{parent}; | |
84 my $model = $parent->model if $parent; | |
85 my $binding, $childContract, @bindingVars; | |
86 | |
87 if(my $info = $this->_namedResources->{$id}) { | |
88 @bindingVars = ($id); | |
89 $childContract = $info->{contract}; | |
90 $binding = $info->{bind}; | |
91 } else { | |
92 foreach my $info ( $this->_regexpResources ) { | |
93 my $rx = $info->{match}; | |
94 next unless $rx; | |
95 if( @bindingVars = ($id =~ m/$rx/) ) { | |
96 $childContract = $info->{contract}; | |
97 $binding = $info->{bind}; | |
98 } | |
99 } | |
100 } | |
101 | |
102 if ($childContract) { | |
103 my $childModel = $binding ? $binding->($parent,$model,@bindingVars) : undef; | |
104 | |
105 return $childContract->CreateResource( | |
106 %args, | |
107 model => $childModel | |
108 ); | |
109 } else { | |
110 die KeyNotFoundException->new($id); | |
111 } | |
29 } | 112 } |
30 | 113 |
31 1; | 114 1; |
32 | 115 |
33 __END__ | 116 __END__ |
79 model => $obj, | 162 model => $obj, |
80 parent => $prentResource, | 163 parent => $prentResource, |
81 id => 'item-something' | 164 id => 'item-something' |
82 ); | 165 ); |
83 | 166 |
167 my $child = $contract->CreateChildResource( | |
168 parent => $resource, | |
169 id => 'info' | |
170 ); | |
171 | |
84 =end code | 172 =end code |
85 | 173 |
86 =head1 DESCRIPTION | 174 =head1 DESCRIPTION |
87 | 175 |
88 =cut | 176 =cut |