# HG changeset patch # User sergey # Date 1352149095 -14400 # Node ID 814d755e5d1231bb4f1b12b00fdf18d6574bb646 # Parent 2270de2469ffc8f462cb9ca852e8d89d9f28a987 Minor fixes diff -r 2270de2469ff -r 814d755e5d12 Lib/IMPL/DOM/Schema/InflateFactory.pm --- a/Lib/IMPL/DOM/Schema/InflateFactory.pm Wed Oct 31 04:18:35 2012 +0400 +++ b/Lib/IMPL/DOM/Schema/InflateFactory.pm Tue Nov 06 00:58:15 2012 +0400 @@ -5,7 +5,7 @@ require IMPL::Object::Factory; sub new { - my ($self,$value) = @_; + my ($self,$value,$schema) = @_; if ($value =~ /^(\w+(?:::\w+)*)(?:\.(\w+))?$/) { return IMPL::Object::Factory->new($1,undef,$2); diff -r 2270de2469ff -r 814d755e5d12 Lib/IMPL/DOM/Schema/SimpleNode.pm --- a/Lib/IMPL/DOM/Schema/SimpleNode.pm Wed Oct 31 04:18:35 2012 +0400 +++ b/Lib/IMPL/DOM/Schema/SimpleNode.pm Tue Nov 06 00:58:15 2012 +0400 @@ -44,7 +44,7 @@ my ($this,$value) = @_; if ( my $inflator = $this->inflator ) { - return $inflator->new($value); + return $inflator->new($value,$this); } else { return $value; } diff -r 2270de2469ff -r 814d755e5d12 Lib/IMPL/Security.pm --- a/Lib/IMPL/Security.pm Wed Oct 31 04:18:35 2012 +0400 +++ b/Lib/IMPL/Security.pm Tue Nov 06 00:58:15 2012 +0400 @@ -53,7 +53,7 @@ } sub context { - AbstractContext->current; + AbstractContext->current || Context->nobody; } 1; diff -r 2270de2469ff -r 814d755e5d12 Lib/IMPL/Web/Application/CustomResource.pm --- a/Lib/IMPL/Web/Application/CustomResource.pm Wed Oct 31 04:18:35 2012 +0400 +++ b/Lib/IMPL/Web/Application/CustomResource.pm Tue Nov 06 00:58:15 2012 +0400 @@ -5,6 +5,7 @@ use IMPL::declare { require => { + Factory => 'IMPL::Object::Factory', CustomResourceContract => 'IMPL::Web::Application::CustomResourceContract' }, base => [ @@ -32,6 +33,18 @@ ); } +sub CreateContract { + my ($self, %args) = @_; + + $self->contractFactory->new( + resourceFactory => Factory->new( + $self, + \%args + ), + resources => [ $self->GetChildResources() ] + ) +} + sub GetChildResources { } @@ -90,6 +103,14 @@ Создает новый экземпляр контракта, используя фабрику из свойства C. +=head2 C<[static]CreateContract(%args)> + +Создает новый контракт, который при создании ресурсов будет передавать им в +конструкторе параметры C<%args>. Реализуется при помощи C +которой задается параметр ссылка на C<%args>, т.о. при создании ресурса, ему в +конструкторе будет передан список из ключей и значений хеша C<%args>, а затем +остальные аргументы. + =head2 C<[static]GetChildResources()> Статический метод, который должны переопределять новые классы ресурсов, у diff -r 2270de2469ff -r 814d755e5d12 Lib/IMPL/Web/Application/Resource.pm --- a/Lib/IMPL/Web/Application/Resource.pm Wed Oct 31 04:18:35 2012 +0400 +++ b/Lib/IMPL/Web/Application/Resource.pm Tue Nov 06 00:58:15 2012 +0400 @@ -69,8 +69,15 @@ die NotFoundException->new($this->location->url,$childId) unless $info; my $binding = $info->{binding}; - my $contract = $info->{contract} - or die OperationException->new("Can't fetch a contract for the resource", $childId); + my $contract = $info->{contract}; + + if (ref $contract eq 'CODE') { + $contract = $contract->(); + $info->{contract} = $contract; + } + + die OperationException->new("Can't fetch a contract for the resource", $childId) + unless $contract; my %args = ( parent => $this, @@ -152,7 +159,7 @@ =head2 C<[get]contract> -Обязательное свойство для ресурса, ссылается, на контракт, соотсетствующий +Обязательное свойство для ресурса, ссылается, на контракт, соответствующий данному ресурсу, используется для выполнения C методов и получения дочерних ресурсов. diff -r 2270de2469ff -r 814d755e5d12 Lib/IMPL/Web/Application/ResourceContract.pm --- a/Lib/IMPL/Web/Application/ResourceContract.pm Wed Oct 31 04:18:35 2012 +0400 +++ b/Lib/IMPL/Web/Application/ResourceContract.pm Tue Nov 06 00:58:15 2012 +0400 @@ -11,7 +11,7 @@ base => [ 'IMPL::Object' => undef ], props => [ resourceFactory => PROP_ALL, - verbs => PROP_ALL, + verbs => PROP_ALL, _namedResources => PROP_ALL, _regexpResources => PROP_ALL | PROP_LIST, ]