package EntityModel::Web::Page;
{
$EntityModel::Web::Page::VERSION = '0.004';
}
use EntityModel::Class {
name => 'string',
path => 'string',
pathtype => 'string',
title => 'string',
description => 'string',
template => 'string',
separator => { type => 'string', default => '/' },
parent => { type => 'EntityModel::Web::Page' },
pathinfo => { type => 'array', subclass => 'EntityModel::Web::Page::Pathinfo' },
data => { type => 'array', subclass => 'EntityModel::Web::Page::Data' },
content => { type => 'array', subclass => 'EntityModel::Web::Page::Content' },
content_by_section => { type => 'hash', subclass => 'EntityModel::Web::Page::Content', watch => { content => 'section' } },
handler => { type => 'array', subclass => 'EntityModel::Web::Page::Handler' },
handler_for_http_verb => { type => 'hash', subclass => 'EntityModel::Web::Page::Handler', watch => { handler => 'type' } },
};
=head1 NAME
EntityModel::Web::Page - handle page definitions
=head1 VERSION
version 0.004
=head1 SYNOPSIS
=head1 DESCRIPTION
=cut
use EntityModel::Web::Response;
use Data::Dumper;
=head1 METHODS
=cut
sub new {
my $class = shift;
my $self = $class->SUPER::new;
my %args = @_;
my $site = delete $args{site};
$self->separator('/');
foreach my $item (qw(name path pathtype title description separator template)) {
if(defined(my $v = delete $args{$item})) {
$self->$item($v);
}
}
$self->pathtype('string') unless $self->pathtype;
if(my $pathinfo = delete $args{pathinfo}) {
$self->pathinfo->push(EntityModel::Web::Page::Pathinfo->new($_)) for @$pathinfo;
}
if(my $data = delete $args{data}) {
$self->data->push(EntityModel::Web::Page::Data->new($_)) for @$data;
}
if(my $content = delete $args{content}) {
$self->content->push(EntityModel::Web::Page::Content->new(%$_)) for @$content;
}
if(my $handler = delete $args{handler}) {
$self->handler->push(EntityModel::Web::Page::Handler->new($_)) for @$handler;
}
if(my $parent = delete $args{parent}) {
$self->parent($site->page_by_name->get($parent));
}
# warn "Create page with " . Dumper \%args;
# warn "Page " . $self->name;
# warn " * Description " . ($self->description // '');
# warn " * Path " . ($self->path // '');
# warn " * Pathtype " . ($self->pathtype // '');
# warn " * Title " . ($self->title // '');
die "pathtype not defined" unless defined $self->pathtype;
return $self;
}
sub handle_request {
my $self = shift;
my %args = @_;
my $req = delete $args{request} or die "No request supplied";
my $response = EntityModel::Web::Response->new(
request => $req,
page => $self
);
# $response->apply_data(delete $args{data}) if exists $args{data};
logDebug("Looking for handler on [%s] for %s", $req->method, $self->name);
logDebug("-> [%s]", $_) for keys %{ $self->handler_for_http_verb };
# If we have a handler set up for this request, use it
if(my $handler = $self->handler_for_http_verb->get($req->method)) {
logWarning("Found [%s]", $handler);
my $rslt = $handler->($response);
# And pass the value back if true (which means the handler's done everything we need)
return $rslt if $rslt;
}
return $response;
}
sub extract_data {
my $self = shift;
my $data = shift;
my %pathinfo;
foreach my $pi ($self->pathinfo->list) {
$pathinfo{$pi->name} = shift @$data;
}
return %pathinfo;
}
1;
__END__
=head1 AUTHOR
Tom Molesworth <cpan@entitymodel.com>
=head1 LICENSE
Copyright Tom Molesworth 2009-2011. Licensed under the same terms as Perl itself.