view Lib/IMPL/Web/Handler/RestController.pm @ 197:6b1dda998839

Added IMPL::declare, IMPL::require, to simplify module definitions IMPL::Transform now admires object inheritance while searching for the transformation Added HTTP some exceptions IMPL::Web::Application::RestResource almost implemented
author sergey
date Thu, 19 Apr 2012 02:10:02 +0400
parents
children 2ffe6f661605
line wrap: on
line source

package IMPL::Web::Handler::RestController;
use strict;

use IMPL::lang qw(:declare :constants);

use IMPL::declare {
	require => {
        NotFoundException => 'IMPL::Web::NotFoundException'
	},
	base => {
		'IMPL::Object' => undef,
	}	
};

BEGIN {
	public property rootResource => PROP_GET | PROP_OWNERSET;
	public property contract => PROP_GET | PROP_OWNERSET;
}

sub Invoke {
	my ($this,$action) = @_;
	
	my $query = $action->query;
	
	my $method = $query->request_method;
	
	#TODO: path_info is broken for IIS
	my $pathInfo = $query->path_info;
	
	my @segments = split /\//, $pathInfo;
	
	my ($obj,$view) = (pop(@segments) =~ m/(.*?)(?:\.(\w+))?$/);
	
	$action->context->{view} = $view;
	
	my $res = $this->rootResource;
	
	while(@segments) {
		$res = $res->InvokeHttpMethod('GET',shift @segments);
		
		die NotFoundException->new() unless $res;
	}
	
	return $res->InvokeHttpMethod($method,$obj);
}

1;

__END__

=pod

=head1 NAME

=head1 SYNOPSIS

=head1 DESCRIPTION

Использует C<$ENV{PATH_INFO}> для получения ресурса и вызова метода.


=cut