Special move for CX::Component::Traits. No tests, please don't look.
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Utils.pm
index 5bff574..22675a9 100644 (file)
@@ -8,8 +8,8 @@ use Path::Class;
 use URI;
 use Carp qw/croak/;
 use Cwd;
-
 use String::RewritePrefix;
+use Moose::Util qw/find_meta/;
 
 use namespace::clean;
 
@@ -49,6 +49,19 @@ sub appprefix {
 
 sub class2appclass {
     my $class = shift || '';
+
+    # Special move to deal with components which are anon classes.
+    # Specifically, CX::Component::Traits c072fb2
+    my $meta = find_meta($class);
+    if ($meta) {
+        while ($meta->is_anon_class) {
+            my @superclasses = $meta->superclasses;
+            return if scalar(@superclasses) > 1; # Fail silently, MI, can't deal..
+            $class = $superclasses[0];
+            $meta = find_meta($class);
+        }
+    }
+
     my $appname = '';
     if ( $class =~ /^(.+?)::([MVC]|Model|View|Controller)::.+$/ ) {
         $appname = $1;
@@ -385,7 +398,7 @@ sub term_width {
 Method which adds the namespace for plugins and actions.
 
   __PACKAGE__->setup(qw(MyPlugin));
-  
+
   # will load Catalyst::Plugin::MyPlugin
 
 =cut
@@ -395,9 +408,14 @@ sub resolve_namespace {
     my $appnamespace = shift;
     my $namespace = shift;
     my @classes = @_;
-    return String::RewritePrefix->rewrite(
-        { '' => $namespace.'::', '+' => '', '~' => $appnamespace . '::' }, @classes,
-      );
+    return String::RewritePrefix->rewrite({
+        q[]  => qq[${namespace}::],
+        q[+] => q[],
+        (defined $appnamespace
+            ? (q[~] => qq[${appnamespace}::])
+            : ()
+        ),
+    }, @classes);
 }