Apache2-REST

 view release on metacpan or  search on metacpan

lib/Apache2/REST/Handler.pm  view on Meta::CPAN

package Apache2::REST::Handler ;

use strict ;
use warnings ;

use Data::Dumper ;
use Apache2::Const qw( 
                       :common :http 
                       );

use Apache2::REST::Conf ;
use Apache2::REST::ErrorOutputRegistry ;

use base qw/Class::AutoAccess/ ;

=head1 NAME

Apache2::REST::Handler - Base class for a resource handler.

=head1 SYNOPSIS

A Handler object is build for each fragment of the URI, and objects are chained via the attibute parent.

You _must_ implement at list one Handler class to handle the root URI of your application and set it in your
apache conf by : PerlSetVar Apache2RESTHandlerRootClass "MyApp::REST::API" (for instance).

You _must_ implement at least one HTTP method (GET,POST,PUT,DELETE ...).

They will be called by the framework like this (for instance):

 $this->GET($request,$response) ;

$request is an Apache2::REST::Request (which is a subclass of Apache2::Request).
$response is an Apache2::REST::Response 


Each method must return a valid Apache2::Const::HTTP_* code. 
Typically Apache2::Const::HTTP_OK when everything went smoothly.

See http://search.cpan.org/dist/Apache2-Controller/lib/Apache2/Controller/Refcard.pm for a list.

You _must_ implement at least one isAuth method along the URI. Typically if you want to allow GET by default:

    sub isAuth{ my ( $self , $method , $req  ) = @ _; return $method eq 'GET' ;}


See L<Apache2::REST> for a full working handler example.


=head2 class

Helper to get the class of this (or this class).

=cut

sub class{
    my ( $self ) = @ _;
    return ref $self || $self ;
}

=head2 handle

Handles a request and does the framework magic.
Override at your own risks.

=cut

sub handle{
    my ( $self , $stack , $req , $resp ) = @_ ;
    #warn "Handling ".Dumper($stack)."\n" ;
    if ( 0 == @$stack ){
        my $method = $req->method();
        ## Check auth first
        if ( $self->isAuth($method , $req )){
            unless( $self->can($method)){
                $resp->message('Method '.$method.' not implemented');
                $resp->status(HTTP_NOT_IMPLEMENTED);
                return HTTP_NOT_IMPLEMENTED ;
            }
            my $res = undef;
            eval{
                $res = $self->$method($req,$resp) ;
            };
            if ( $@ ){
                my $err = $@ ;
                Apache2::REST::ErrorOutputRegistry->instance()->getOutput($self->conf()->Apache2RESTErrorOutput())->handle($err,$resp, $req);
                

lib/Apache2/REST/Handler.pm  view on Meta::CPAN

    if ( defined $newC ){
        $self->{'_conf'} = $newC ;
    }
    return $self->{'_conf'} || $self->parent()->conf() ;
}

=head2 isTopLevel

Returns true if this handler handles the application top level.

Usage:
    
    if ( $this->isTopLevel() ){ .. }

=cut

sub isTopLevel{
    my ( $self ) = @_ ;
    return ! $self->parent() ;
}


=head2 rootHandler

Returns the root handler processing this request.

=cut

sub rootHandler{
    my ( $self ) = @_ ;
    if ( $self->isTopLevel() ){ return $self ;}
    return $self->parent()->rootHandler() ;
}


=head2 seekByClass
    
Seek for a handler of the given class along the parent path.
Returns the first handler found or undef if nothing found.
    
usage:
    
    my $handler = $self->seekByClass('My::REST::API::myclass') ;

=cut

sub seekByClass{
    my ($self ,$className) = @_ ;
    if ( $self->class() eq $className ){
        return $self ;
    }
    if ( $self->isTopLevel()){ return undef ;}
    return $self->parent()->seekByClass($className) ;
}


1 ;

#GET
#POST
#PUT
#DELETE
#new



( run in 1.203 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )