Mercurial > pub > Impl
diff Lib/IMPL/Web/QueryHandler/UrlController.pm @ 110:c13a215508ca
Refactoring,
ControllerUnit
author | wizard |
---|---|
date | Mon, 17 May 2010 17:42:27 +0400 |
parents | Lib/IMPL/Web/QueryHandler/SecureCall.pm@964587c5183c |
children | 5a9f64890c31 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Lib/IMPL/Web/QueryHandler/UrlController.pm Mon May 17 17:42:27 2010 +0400 @@ -0,0 +1,51 @@ +package IMPL::Web::QueryHandler::UrlController; +use strict; +use base qw(IMPL::Web::QueryHandler); + +use IMPL::Class::Property; +use IMPL::Exception; +use Carp; + +BEGIN { + public property namespace => prop_all; +} + +__PACKAGE__->PassThroughArgs; + +sub Process { + my ($this,$action,$nextHandler) = @_; + + my $namespace = $this->namespace || $action->application->type; + + my @target = grep $_, split /\//, ($ENV{PATH_INFO} || '') or die new IMPL::Exception("No target specified"); + + my $method = pop @target; + $method =~ s/\.\w+$//; + + my $module = join '::',$namespace,@target; + + eval "require $module; 1;" unless $INC{$module}; + carp $@ if $@; + + if(UNIVERSAL::can($module,'InvokeAction')) { + $module->InvokeAction($method,$action); + } else { + die new IMPL::InvalidOperationException("Failed to invoke action",$ENV{PATH_INFO},$module,$method); + } +} + +1; + +__END__ + +=pod + +=head1 NAME + +C<IMPL::Web::QueryHandler::UrlController> - вызов метода на основе <url> запроса. + +=head1 DESCRIPTION + +Использует переменную C<$ENV{PATH_INFO}> для получения имени и метода модуля. + +=cut \ No newline at end of file