Catalyst-Plugin-URLMap

 view release on metacpan or  search on metacpan

lib/Catalyst/Plugin/URLMap.pm  view on Meta::CPAN

package Catalyst::Plugin::URLMap;

use Moose::Role;
use namespace::autoclean;
use Plack::Util;
use Plack::App::URLMap;
use Scalar::Util 'blessed', 'weaken';
use Catalyst::Utils;
use Text::SimpleTable;

our $VERSION = '0.002';

my $from_plack_app = sub {
  my $app = shift;
  if($app->can('to_app')) {
    return $app->to_app;
  } elsif($app->can('psgi_app')) {
    return $app->psgi_app;
  } else {
    die ref($app). " is not a plack compatible application";
  }
};

my ($do_mapping, $weakened_do_mapping);
$do_mapping = $weakened_do_mapping = sub {
  my ($psgi_app, $t, $root, %maps) = @_;

  foreach my $url_part (keys %maps) {
    my $target = $maps{$url_part};
    my $map_url = join ('', $root, $url_part);

    if(ref $target eq 'CODE') {
      $psgi_app->map($url_part, $target);
      $t->row($map_url, 'CODE');
    } elsif(blessed $target) {
      $psgi_app->map($url_part, $from_plack_app->($target));
      $t->row($map_url, ref $target);
    } elsif(ref $target eq 'HASH') {
      if( (%$target)[0] =~m/^\//) {
        my $localmap = Plack::App::URLMap->new;
        weaken $weakened_do_mapping;
        $localmap = $weakened_do_mapping->($localmap, $t, $map_url, %$target);
        $psgi_app->map($url_part, $localmap->to_app);
      } else {
        my ($module, $args) = %{$target};
        my $normalized_module = Plack::Util::load_class($module, 'Plack::App');
        $psgi_app->map($url_part, $from_plack_app->($normalized_module->new(%$args)));
        $t->row($map_url, $normalized_module);
      }
    } elsif($target) {
      my $normalized_module = Plack::Util::load_class($target, 'Plack::App');
      $psgi_app->map($url_part, $from_plack_app->($normalized_module->new));



( run in 0.794 second using v1.01-cache-2.11-cpan-65fba6d93b7 )