Special move for CX::Component::Traits. No tests, please don't look.
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Utils.pm
index 76f0733..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;
 
@@ -23,7 +23,7 @@ See L<Catalyst>.
 
 =head1 DESCRIPTION
 
-Catalyst Utilities. 
+Catalyst Utilities.
 
 =head1 METHODS
 
@@ -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;
@@ -299,7 +312,7 @@ sub merge_hashes {
     my ( $lefthash, $righthash ) = @_;
 
     return $lefthash unless defined $righthash;
-    
+
     my %merged = %$lefthash;
     for my $key ( keys %$righthash ) {
         my $right_ref = ( ref $righthash->{ $key } || '' ) eq 'HASH';
@@ -313,7 +326,7 @@ sub merge_hashes {
             $merged{ $key } = $righthash->{ $key };
         }
     }
-    
+
     return \%merged;
 }
 
@@ -348,10 +361,10 @@ All you need to get this work, is:
 
 1) Install Term::Size::Any, or
 
-2) Export $COLUMNS from your shell. 
+2) Export $COLUMNS from your shell.
 
 (Warning to bash users: 'echo $COLUMNS' may be showing you the bash
-variable, not $ENV{COLUMNS}. 'export COLUMNS=$COLUMNS' and you should see 
+variable, not $ENV{COLUMNS}. 'export COLUMNS=$COLUMNS' and you should see
 that 'env' now lists COLUMNS.)
 
 As last resort, default value of 80 chars will be used.
@@ -385,18 +398,24 @@ sub term_width {
 Method which adds the namespace for plugins and actions.
 
   __PACKAGE__->setup(qw(MyPlugin));
-  
+
   # will load Catalyst::Plugin::MyPlugin
 
 =cut
 
 
 sub resolve_namespace {
+    my $appnamespace = shift;
     my $namespace = shift;
     my @classes = @_;
-    return String::RewritePrefix->rewrite(
-        { '' => $namespace.'::', '+' => '' }, @classes,
-      );
+    return String::RewritePrefix->rewrite({
+        q[]  => qq[${namespace}::],
+        q[+] => q[],
+        (defined $appnamespace
+            ? (q[~] => qq[${appnamespace}::])
+            : ()
+        ),
+    }, @classes);
 }
 
 
@@ -406,7 +425,7 @@ Catalyst Contributors, see Catalyst.pm
 
 =head1 COPYRIGHT
 
-This program is free software, you can redistribute it and/or modify it under
+This library is free software. You can redistribute it and/or modify it under
 the same terms as Perl itself.
 
 =cut