# Rest - mini-framework for creating REST-ful web apps
# Copyright 2006, Daniel J. Parks
#
# (insert license, disclaimer/non-warranty, etc. here)
#
# (insert install instructions here; no, put them in POD)
# TODO: POD, tests
# TODO: return useful HTTP error codes
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
",
"", (map { "- $_
- $urls->{$_}
" } keys %$urls), "
",
"Path info: ", $cgi->path_info, "
",
"Request method: ", $cgi->request_method, "
",
$cgi->end_html;
}
sub run {
my ($self, %urls) = @_;
my $pathInfo = $self->cgi->path_info;
my $method = $self->cgi->request_method;
my ($package, @pathParams);
foreach my $path ( keys %urls ) {
$package = $urls{$path};
if ( $pathInfo =~ $path ) {
@pathParams = ($1, $2, $3, $4, $5, $6, $7, $8, $9);
last;
}
undef $package;
}
if ( $package ) {
my $dispatcher = $package->new;
if ( $dispatcher->can($method) ) {
$dispatcher->$method($self->cgi, @pathParams);
return;
}
}
if ( $DEBUG ) {
$self->debug(\%urls, $@);
}
else {
print $self->cgi->header, $self->cgi->start_html, $self->cgi->end_html;
}
}
1;