Mercurial > pub > Impl
comparison Lib/Engine/Action/URICall.pm @ 0:03e58a454b20
Создан репозитарий
| author | Sergey |
|---|---|
| date | Tue, 14 Jul 2009 12:54:37 +0400 |
| parents | |
| children | 16ada169ca75 |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:03e58a454b20 |
|---|---|
| 1 package Engine::Action::URICall; | |
| 2 use strict; | |
| 3 use Common; | |
| 4 use Engine::Action; | |
| 5 | |
| 6 our $Namespace; | |
| 7 | |
| 8 our %MapOutput; | |
| 9 our $DefaultMethod; | |
| 10 | |
| 11 %MapOutput = ( page => 'Engine::Output::Page' , xml => 'Engine::Output::Xml' ) if not %MapOutput; | |
| 12 | |
| 13 =pod | |
| 14 /module/submodule/method.format | |
| 15 =cut | |
| 16 | |
| 17 sub ConstructAction { | |
| 18 my ($class,$uriRequest) = @_; | |
| 19 | |
| 20 my @module = $uriRequest->path_segments; | |
| 21 | |
| 22 my ($function,$format) = (((pop @module) or $DefaultMethod) =~ m/^(.*?)(?:\.(\w+))?$/); | |
| 23 @module = grep $_, @module; | |
| 24 my $module = @module ? ($Namespace ? $Namespace . '::' : '').join('::',@module) : $Namespace; | |
| 25 | |
| 26 return new Engine::Action( Package => $module, Method => $function, Output => $class->MapOutput($format), RequestURI => $uriRequest); | |
| 27 } | |
| 28 | |
| 29 sub MapOutput { | |
| 30 my ($class,$format) = @_; | |
| 31 my $module = $MapOutput{$format} or return undef; | |
| 32 | |
| 33 eval "require $module;" or die new Exception('Failed to load output module',$module,$@); | |
| 34 | |
| 35 if ($module->can('construct')) { | |
| 36 return $module->construct($format); | |
| 37 } else { | |
| 38 return $module; | |
| 39 } | |
| 40 } | |
| 41 | |
| 42 1; |
