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;