Mercurial > pub > Impl
view Lib/IMPL/Web/RestContract.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 | 77a9934a44af |
children |
line wrap: on
line source
package IMPL::Web::RestContract; use strict; use IMPL::lang qw(:declare); use IMPL::declare { require => { Exception => 'IMPL::Exception', InvalidOpException => '-IMPL::InvalidOperationException', ForbiddenException => 'IMPL::Web::ForbiddenException', TRestResource => 'IMPL::Web::Application::RestResource', RestBaseResource => 'IMPL::Web::Application::RestBaseResource', }, base => { 'IMPL::Transform' => sub { my %args = @_; $args{resources} }, 'IMPL::Object::Serializable' => undef } }; sub CTOR { my ($this) = @_; $this->templates->{-plain} = sub { die ForbiddenException->new(); }; $this->templates->{-default} = sub { die ForbiddenException->new(); }; $this->templates->{&RestBaseResource} = sub { $_[1] }; } sub ProcessTemplate { my ($this,$t,$obj,$props) = @_; $props ||= {}; if (ref $t eq 'HASH') { my $factory = $t->{factory} || TRestResource; return $factory->new(%$t, target => $obj, contract => $this, %$props); } elsif (ref $t eq 'CODE') { return $this->$t($obj,$props); } else { die InvalidOpException->new(); } } 1; __END__ =pod =head1 NAME C<IMPL::Web::RestContract> Описывает правила публикации ресурсов. =head1 SYNOPSIS =begin code =end code =head1 DESCRIPTION Контракт представляет собой отображение модели предметной области на модель ресурсов. Контракт описывает дерево ресурсов начиная с корневого ресурса, и далее. Ресурсы состоят из нескольких описаний: C<ResourceContract>, C<OperationContract> которые описываю отображение самих ресурсов и операций над ресурсами в предметную область. C<ResourceContract> представляет собой описание того, какой ресурс и с какими параметрами должен быть создан. Например, может быть создан ресурс публикующий методы родительского ресурса, или же ресурс может слжить контроллером для работы с объектами предметной области. C<OperationContract> описывает связь между методом объекта предметной области и операцией возможной над ресурсом. Операция сводится к преобразованию запроса в аргументы метода, затем вызову метода и преобразованию результата в ответ на запрос. Ответ на запрос может быть как сформирован полностью в виде C<HTTP> ответа, так и в виде объекта, который будет в дальнейшем обработан нижележащими обработчиками приложения. =cut