Revision 8 (by ahitrov@rambler.ru, 2010/03/29 11:46:38) |
Contenido UTF-8 core files
|
package Contenido::Request;
# ----------------------------------------------------------------------------
# Contenido::Request - класс, который будет создаваться для каждого
# запроса и незримо присутствовать. В него мы инкапсулируем все данные
# о текущем запросе (в том числе и результаты выполнения URI mapping,
# то есть названия конкретных компонент, которые должны обрабатывать
# этот запрос). Объект этого типа будет создаваться для каждого
# запроса до того, как HTML::Mason получит управление.
# ----------------------------------------------------------------------------
use strict;
use warnings;
use locale;
use vars qw($VERSION $AUTOLOAD);
$VERSION = '1.0';
use Data::Dumper;
use Contenido::Globals;
sub new
{
my ($proto,$state) = @_;
$log->error("Неправильный вызов конструктора объекта проекта. В параметрах нет объекта класса Contenido::State") unless ref $state;
my $class = ref($proto) || $proto;
my $self = {};
bless($self, $class);
# Запомним то, что нас интересует...
$self->{data} = {};
$self->{_cache_} = {};
$self->{timer_start} = time();
foreach my $a ( qw(timer_start timer_finish) )
{
$self->{attributes}->{ $a } = 'SCALAR';
}
return $self;
}
sub set_properties
{
my ($self, %P) = @_;
foreach my $p (keys(%P))
{
$self->{data}->{$p} = $P{$p};
$self->{attributes}->{ $p } = 'DATA';
};
return 1;
}
sub get_args {
my $self = shift;
if (exists $self->{request_args}) {
return wantarray ? %{$self->{request_args}} : $self->{request_args};
}
my $apr = $self->r();
my $args = {};
if ($apr) {
foreach my $key ( $apr->param ) {
my @values = $apr->param($key);
$args->{$key} = @values == 1 ? $values[0] : \@values;
}
}
$self->{request_args} = $args;
return wantarray ? %{ $self->{request_args} } : $self->{request_args};
}
sub is_post {
my $self = shift;
return $self->r()->method() =~ /^post/i ? 1 : undef;
}
# ----------------------------------------------------------------------------
# Это умный AUTOLOAD. Ловит методов для установки/чтения полей...
# Версия 0.2/Модифицированная версия
# ----------------------------------------------------------------------------
sub AUTOLOAD
{
my $self = shift;
my $attribute = $AUTOLOAD;
$attribute =~ s/.*:://;
return undef unless $attribute =~ /[^A-Z]/; # Отключаем методы типа DESTROY
unless ( exists $self->{attributes}->{$attribute} ) {
$log->error("Вызов метода, для которого не существует обрабатываемого свойства: ->$attribute()");
return undef;
}
if ($self->{attributes}->{$attribute} eq 'DATA')
{
$self->{data}->{ $attribute } = shift @_ if (scalar(@_) > 0);
return $self->{data}->{ $attribute };
} else {
$self->{ $attribute } = shift @_ if (scalar(@_) > 0);
return $self->{ $attribute };
}
}
1;