use UNIVERSAL::require;
use strict;
use warnings;
-our $VERSION = "1.3";
+our $VERSION = "1.8";
__PACKAGE__->mk_classdata($_) for qw( config init_done view_object );
__PACKAGE__->mk_accessors ( qw( ar params query objects model_class
args action template ));
__PACKAGE__->config({});
__PACKAGE__->init_done(0);
-
-# Ape Apache::Constants interface
-use constant OK => 0;
-use constant DECLINED => -1;
+use Maypole::Constants;
sub debug { 0 }
sub handler {
# See Maypole::Workflow before trying to understand this.
- my $class = shift;
+ my ( $class, $req ) = @_;
$class->init unless $class->init_done;
my $r = bless { config => $class->config }, $class;
- $r->get_request();
+ $r->get_request($req);
$r->parse_location();
+ my $status = $r->handler_guts();
+ return $status unless $status == OK;
+ $r->send_output;
+ return $status;
+}
+sub handler_guts {
+ my $r = shift;
$r->model_class($r->config->{model}->class_of($r, $r->{table}));
- my $status = $r->is_applicable;
- if ($status == OK) {
- $status = $r->call_authenticate;
- if ($r->debug and $status != OK and $status != DECLINED) {
- $r->view_object->error($r,
- "Got unexpected status $status from calling authentication");
- }
- return $status unless $status == OK;
- $r->additional_data();
-
- $r->model_class->process($r);
- } else {
- # Otherwise, it's just a plain template.
- $r->call_authenticate; # No harm in it
+ my $applicable = $r->is_applicable;
+ unless ($applicable == OK) {
+ # It's just a plain template
delete $r->{model_class};
- $r->{path} =~ s{/}{}; # De-absolutify
+ $r->{path} =~ s{/$}{}; # De-absolutify
$r->template($r->{path});
}
- $status = OK;
- if (!$r->{output}) { # You might want to do it yourself
- $status = $r->view_object->process($r);
+ # We authenticate every request, needed for proper session management
+ my $status = $r->call_authenticate;
+ if ($r->debug and $status != OK and $status != DECLINED) {
+ $r->view_object->error($r,
+ "Got unexpected status $status from calling authentication");
}
- $r->send_output;
- return $status;
+ return $status unless $status == OK;
+ # We run additional_data for every request
+ $r->additional_data;
+ if ($applicable == OK) {
+ $r->model_class->process($r);
+ }
+ if (!$r->{output}) { # You might want to do it yourself
+ return $r->view_object->process($r);
+ } else { return OK; }
}
sub is_applicable {
my $self = shift;
my $config = $self->config;
- $config->{ok_tables} = {map {$_ => 1} @{$config->{display_tables}}};
+ $config->{ok_tables} ||= $config->{display_tables};
+ $config->{ok_tables} = {map {$_=>1} @{$config->{ok_tables}}}
+ if ref $config->{ok_tables} eq "ARRAY";
warn "We don't have that table ($self->{table})"
if $self->debug and not $config->{ok_tables}{$self->{table}};
return DECLINED() unless exists $config->{ok_tables}{$self->{table}};
sub call_authenticate {
my $self = shift;
- return $self->model_class->authenticate($self) if
- $self->model_class->can("authenticate");
+ # Check if we have a model class
+ if ($self->{model_class}) {
+ return $self->model_class->authenticate($self) if
+ $self->model_class->can("authenticate");
+ }
return $self->authenticate($self); # Interface consistency is a Good Thing
}
You should probably not use Maypole directly. Maypole is an abstract
class which does not specify how to communicate with the outside world.
The most popular subclass of Maypole is L<Apache::MVC>, which interfaces
-the Maypole framework to Apache mod_perl.
+the Maypole framework to Apache mod_perl; another important one is
+L<CGI::Maypole>.
If you are implementing Maypole subclasses, you need to provide at least
the C<parse_location> and C<send_output> methods. You may also want to
http://maypole.simon-cozens.org/
+L<Apache::MVC>, L<CGI::Maypole>.
+
+=head1 MAINTAINER
+
+Sebastian Riedel, c<sri@oook.de>
+
=head1 AUTHOR
Simon Cozens, C<simon@cpan.org>
+=head1 THANK YOU
+
+Jesse Scheidlower, Jody Belka, Markus Ramberg, Mickael Joanne, Simon Flack and all the others who've helped.
+
=head1 LICENSE
You may distribute this code under the same terms as Perl itself.
=cut
1;
-