Apache-Hendrix
view release on metacpan or search on metacpan
lib/Apache/Hendrix.pm view on Meta::CPAN
class_has 'json' => (
isa => 'Object', is => 'rw',
default => sub { JSON::XS->new()->allow_blessed(1)->convert_blessed(1) },
);
class_has 'handlers' => ( isa => 'HashRef[ArrayRef]', is => 'rw', default => sub { {} } );
class_has 'class_base' => ( isa => 'Str', is => 'rw', default => sub {'/'} );
class_has 'request' => ( isa => 'Apache2::Request', is => 'rw' );
class_has 'my_template' => (
isa => 'HashRef[Template]',
is => 'rw',
default => sub { {} },
required => 0,
);
class_has 'my_template_config' => (
isa => 'HashRef[HashRef]',
is => 'rw',
default => sub { {} },
);
my $template_config_default = sub {
{
INCLUDE_PATH => $ENV{TEMPLATE_PATH},
INTERPOLATE => 0,
POST_CHOMP => 1,
EVAL_PERL => 0,
}
};
my $template_default = sub {
return Template->new( __PACKAGE__->my_template_config );
};
class_has 'template_variable' => ( isa => 'HashRef[HashRef]', is => 'rw', required => 0, default => sub { return {} } );
Moose::Exporter->setup_import_methods(
as_is => [
qw/handler base
get post head put any
template template_config template_variable/
] );
sub base {
return __PACKAGE__->class_base(shift);
}
sub handler {
my ($r) = @_;
$r = Apache2::Request->new($r);
__PACKAGE__->request($r);
my %params;
%params = %{ $r->param } if $r->param;
my $uri = $r->uri;
# Find handlers for this type of request
my $handlers =
__PACKAGE__->handlers->{ $ENV{CONTEXT_PREFIX} }->{ $ENV{REQUEST_METHOD} };
# 404 if we don't have any
return Apache2::Const::NOT_FOUND if !$handlers;
# Check one by one to see if we have a match, either string or regexp
ROUTE:
for my $route ( @{$handlers} ) {
my $base = $route->get_base();
my $tmp_uri = $uri;
$tmp_uri =~ s/^$base//;
$tmp_uri ||= '/';
if (
(
# RegEXP
ref( $route->get_path ) eq 'Regexp'
&& $tmp_uri =~ $route->get_path
)
|| $route->get_path eq $tmp_uri
)
{
my $path = $route->get_path();
$uri =~ s/^$base\/*//;
$uri ||= '/';
$uri =~ m/$path/;
if (%+) {
@params{ keys %+ } = values %+;
}
my $result = $route->get_method->( \%params, $r, $route );
if ( ref $result ) {
return make_json( $r, $result );
}
return $result;
}
} ## end ROUTE: for my $route ( @{$handlers...})
# No route found, we 404.
return Apache2::Const::NOT_FOUND;
} ## end sub handler
sub make_json {
my ( $r, $object ) = @_;
my $result = __PACKAGE__->json->encode($object);
$r->content_type('application/json');
$r->set_content_length( length($result) );
print $result;
return Apache2::Const::OK;
}
## Route Handling
sub route {
my ( $types, @route ) = @_;
my $handlers = __PACKAGE__->handlers->{ $ENV{CONTEXT_PREFIX} };
for my $route_type ( @{$types} ) {
push @{ $handlers->{$route_type} },
Apache::Hendrix::Route->new( {
path => $route[ 0 ],
method => $route[ 1 ],
base => __PACKAGE__->class_base,
} );
}
__PACKAGE__->handlers->{ $ENV{CONTEXT_PREFIX} } = $handlers;
return;
}
sub get { ## no critic (RequireArgUnpacking)
return route( [ 'GET' ], @_ );
}
sub head { ## no critic (RequireArgUnpacking)
return route( [ 'HEAD' ], @_ );
}
sub post { ## no critic (RequireArgUnpacking)
return route( [ 'POST' ], @_ );
}
sub put { ## no critic (RequireArgUnpacking)
return route( [ 'PUT' ], @_ );
}
sub any {
my (@route) = @_;
# If we haven't specified which type, it's truly "any" route.
# Which for us is currently GET, POST, and HEAD.
if ( scalar(@route) == 2 ) {
unshift @route, [ 'GET', 'POST', 'HEAD', 'PUT' ];
}
return route(@route);
( run in 2.347 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )