diff Lib/IMPL/Web/Application/CustomResource.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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Lib/IMPL/Web/Application/CustomResource.pm	Sat Sep 29 02:34:47 2012 +0400
@@ -0,0 +1,113 @@
+package IMPL::Web::Application::CustomResource;
+use strict;
+
+use IMPL::lang qw(:constants);
+
+use IMPL::declare {
+    require => {
+        CustomResourceContract => 'IMPL::Web::Application::CustomResourceContract'        
+    },
+    base => [
+        'IMPL::Web::Application::Resource' => '@_'
+    ]
+};
+
+__PACKAGE__->static_accessor(contractFactory => CustomResourceContract );
+__PACKAGE__->static_accessor_own(_contractInstance => undef);
+
+sub contractInstance {
+    my ($self) = @_;
+    
+    $self = ref $self || $self;
+    $self->_contractInstance ? $self->_contractInstance : $self->InitContract();
+}
+
+sub InitContract {
+    my ($self) = @_;
+    
+    $self->_contractInstance( $self->contractFactory->new(resourceFactory => $self ) ); 
+}
+
+sub GetChildResources {
+    
+}
+
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+C<IMPL::Web::Application::CustomResource> - базовый класс для ресурсов,
+реальзуемых в коде.
+
+=head1 SYNOPSIS
+
+=begin code
+
+package MyApp::Web::Resources::ProfileResource;
+use IMPL::declare {
+    base => [
+        'IMPL::Web::Application::CustomResource' => '@_'
+    ]
+}
+
+sub HttpGet {
+    my ($this) = @_;
+    return $this->model;
+}
+
+sub HttpPut {
+    my ($this,$action) = @_;
+    
+    my $form = MyApp::Web::Schema::UpdateUser->new();
+    
+    $this->model->update( $form->Bind($action) );
+}
+
+=end code
+
+=head1 MEMBERS
+
+=head2 C<[static]contractFactory>
+
+Фабрика, используемая для получения контракта ресурса. По умолчанию
+C<IMPL::Web::Application::CustomResourceContract>.
+
+=head2 C<[static]contractInstance>
+
+Экземпляр контракта для ресурса. Создается при первом обращении при помощи
+метода C<InitContract()>.
+
+=head2 C<[static]InitContract()>
+
+Создает новый экземпляр контракта, используя фабрику из свойства C<contractFactory>.
+
+=head2 C<[static]GetChildResources()>
+
+Статический метод, который должны переопределять новые классы ресурсов, у
+которых есть дочерние ресурсы.
+
+=begin code
+
+package MyApp::Web::MyResource
+
+sub GetChildResources {
+    my $self = shift;
+    return
+        $self->SUPER::GetChildResources(),
+        {
+            
+        }
+        {
+            
+        };
+}
+
+=end code
+
+
+=cut
\ No newline at end of file