package REST; use strict; use CGI; our $DEBUG = 0; sub new { return bless {CGI => CGI->new}, shift }; sub cgi { shift()->{CGI} } sub debug { my ($self, $urls, @problems) = @_; my $cgi = $self->cgi; print $cgi->header, $cgi->start_html, "REST::debug executing: @problems
##
#!/usr/bin/perl -w
# (index.pl)
use strict;
use REST;
use HTML::Template;
my %urls = (
qr{^/?$} => 'Welcome',
qr{^/hello$} => 'NiceToMeetYou',
qr{^/bye/(\w+)$} => 'Goodbye',
);
REST->new->run(%urls);
####
package Renderer;
# a class w/common functionality in all "application" classes
sub new {
my ($class, $cgi) = @_;
return bless { CGI => $cgi }, $class;
}
sub cgi { return shift->{CGI} }
sub render {
my ($self, $content) = @_;
my $templateText = q{
Welcome
};
my $template = HTML::Template->new_scalar_ref(\$templateText);
$template->param(CONTENT => $content);
print $self->cgi->header(-type => 'text/html'), $template->output;
}
package Welcome;
use base 'Renderer';
sub GET {
my $self = shift;
$self->render(q{
Welcome. My name is Perl. What's your name?
});
}
package NiceToMeetYou;
use base 'Renderer';
sub POST {
my $self = shift;
my $name = $self->cgi->param('name'); # yes, it would be scrubbed in production code
$self->render(qq{
Nice to meet you $name.
Leaving already?
});
}
package Goodbye;
use base 'Renderer';
sub GET {
my ($self, $name) = @_;
$self->render("Goodbye, $name. It was nice visiting.");
}