comparison Lib/IMPL/Web/Application/RestBaseResource.pm @ 201:0c018a247c8a

Reworked REST resource classes to be more transparent and intuitive
author sergey
date Tue, 24 Apr 2012 19:52:07 +0400
parents a9dbe534d236
children 5146e17a7b76
comparison
equal deleted inserted replaced
200:a9dbe534d236 201:0c018a247c8a
20 20
21 BEGIN { 21 BEGIN {
22 public property id => PROP_GET | PROP_OWNERSET; 22 public property id => PROP_GET | PROP_OWNERSET;
23 public property parent => PROP_GET | PROP_OWNERSET; 23 public property parent => PROP_GET | PROP_OWNERSET;
24 public property contract => PROP_GET | PROP_OWNERSET; 24 public property contract => PROP_GET | PROP_OWNERSET;
25 protected property final => PROP_ALL;
25 } 26 }
26 27
27 sub target { 28 sub target {
28 shift; 29 shift;
29 } 30 }
47 48
48 return $map{$method}; 49 return $map{$method};
49 } 50 }
50 51
51 sub InvokeHttpMethod { 52 sub InvokeHttpMethod {
52 my ($this,$method,$childId,$action) = @_; 53 my ($this,$method,$action) = @_;
53 54
54 my $impl = $this->GetHttpImpl($method) || 'HttpFallbackImpl'; 55 my $impl = $this->GetHttpImpl($method) || 'HttpFallbackImpl';
55 56
56 return $this->$impl($childId,$action); 57 return $this->$impl($action);
57 } 58 }
58 59
59 sub GetImpl { 60 sub GetImpl {
60 die NotImplException->new(); 61 die NotImplException->new();
61 } 62 }
74 75
75 sub HttpFallbackImpl { 76 sub HttpFallbackImpl {
76 die ForbiddenException->new(); 77 die ForbiddenException->new();
77 } 78 }
78 79
80 sub FetchChildResource {
81 return undef;
82 }
83
79 sub InvokeMember { 84 sub InvokeMember {
80 my ($this,$method,$action) = @_; 85 my ($this,$method,$action) = @_;
81 86
82 die ArgumentException->new("method","No method information provided") unless $method; 87 die ArgumentException->new("method","No method information provided") unless $method;
83 88
88 }; 93 };
89 } 94 }
90 95
91 if (ref $method eq 'HASH') { 96 if (ref $method eq 'HASH') {
92 my $member = $method->{method} or die InvalidOpException->new("A member name isn't specified"); 97 my $member = $method->{method} or die InvalidOpException->new("A member name isn't specified");
98
93 my @args; 99 my @args;
94 100
95 if (my $params = $method->{parameters}) { 101 if (my $params = $method->{parameters}) {
96 if (ref $params eq 'HASH') { 102 if (ref $params eq 'HASH') {
97 @args = map { 103 @args = map {
106 } 112 }
107 return $this->target->$member(@args); 113 return $this->target->$member(@args);
108 } elsif (ref $method eq TResolve) { 114 } elsif (ref $method eq TResolve) {
109 return $method->Invoke($this->target); 115 return $method->Invoke($this->target);
110 } elsif (ref $method eq 'CODE') { 116 } elsif (ref $method eq 'CODE') {
111 return $method->($this->target,$action); 117 return $method->($this,$action);
112 } else { 118 } else {
113 die InvalidOpException->new("Unsupported type of the method information", ref $method); 119 die InvalidOpException->new("Unsupported type of the method information", ref $method);
114 } 120 }
115 } 121 }
116 122
119 125
120 if ($param) { 126 if ($param) {
121 if (is $param, TTransform ) { 127 if (is $param, TTransform ) {
122 return $param->Transform($this,$action->query); 128 return $param->Transform($this,$action->query);
123 } elsif ($param and not ref $param) { 129 } elsif ($param and not ref $param) {
124 my %std = ( 130 return $action->query->param($param);
125 id => $this->id, 131 } else {
126 action => $action, 132 die new InvalidOpException->new("Unsupported parameter mapping", $param);
127 query => $action->query
128 );
129
130 return $std{$param} || $action->query->param($param);
131 } 133 }
132 } else { 134 } else {
133 return undef; 135 return undef;
134 } 136 }
135 } 137 }
136 138
137 139
138 1; 140 1;
141
142 __END__
143
144 =pod
145
146
147
148 =cut