view Lib/IMPL/Web/Application/CustomResource.pm @ 250:129e48bb5afb

DOM refactoring ObjectToDOM methods are virtual QueryToDOM uses inflators Fixed transform for the complex values in the ObjectToDOM QueryToDOM doesn't allow to use complex values (HASHes) as values for nodes (overpost problem)
author sergey
date Wed, 07 Nov 2012 04:17:53 +0400
parents 814d755e5d12
children 9b25e1f50144
line wrap: on
line source

package IMPL::Web::Application::CustomResource;
use strict;

use IMPL::Const qw(:prop);

use IMPL::declare {
    require => {
        Factory => 'IMPL::Object::Factory',
        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,
            resources => [ $self->GetChildResources() ]
        )
    ); 
}

sub CreateContract {
    my ($self, %args) = @_;
    
    $self->contractFactory->new(
        resourceFactory => Factory->new(
            $self,
            \%args
        ),
        resources => [ $self->GetChildResources() ]
    )
}

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]CreateContract(%args)>

Создает новый контракт, который при создании ресурсов будет передавать им в
конструкторе параметры C<%args>. Реализуется при помощи C<IMPL::Object::Factory>
которой задается параметр ссылка на C<%args>, т.о. при создании ресурса, ему в
конструкторе будет передан список из ключей и значений хеша C<%args>, а затем
остальные аргументы.

=head2 C<[static]GetChildResources()>

Статический метод, который должны переопределять новые классы ресурсов, у
которых есть дочерние ресурсы.

=begin code

package MyApp::Web::MyResource

sub GetChildResources {
    my $self = shift;
    return
        $self->SUPER::GetChildResources(),
        {
            name => 'info',
            contract => $contractInfo
        };
}

=end code

Метод возвращает список из хешей, которые будут переданы в качестве параметра
C<resources> контракту данного ресурса.

=cut