Add setup_finalize as an easy way to hook at the end of setup.
[catagits/Catalyst-Runtime.git] / lib / Catalyst.pm
index 3471a6c..7cc3184 100644 (file)
@@ -1,11 +1,6 @@
 package Catalyst;
 
-# we don't need really need this, but if we load it before MRO::Compat gets
-# loaded (via Moose and Class::MOP), we can avoid some nasty warnings
-use Class::C3;
-
 use Moose;
-use Class::MOP::Object ();
 extends 'Catalyst::Component';
 use bytes;
 use Scope::Upper ();
@@ -26,12 +21,12 @@ use Time::HiRes qw/gettimeofday tv_interval/;
 use URI ();
 use URI::http;
 use URI::https;
-use Scalar::Util qw/weaken blessed/;
+use Scalar::Util qw/weaken/;
 use Tree::Simple qw/use_weak_refs/;
 use Tree::Simple::Visitor::FindByUID;
 use attributes;
 use utf8;
-use Carp qw/croak carp/;
+use Carp qw/croak carp shortmess/;
 
 BEGIN { require 5.008001; }
 
@@ -82,7 +77,7 @@ __PACKAGE__->stats_class('Catalyst::Stats');
 
 # Remember to update this in Catalyst::Runtime as well!
 
-our $VERSION = '5.8000_04';
+our $VERSION = '5.8000_05';
 
 sub import {
     my ( $class, @arguments ) = @_;
@@ -511,9 +506,24 @@ sub _comp_search_prefixes {
 
     # don't warn if we didn't find any results, it just might not exist
     if( @result ) {
-        $c->log->warn( qq(Found results for "${name}" using regexp fallback.) );
-        $c->log->warn( 'Relying on the regexp fallback behavior for component resolution is unreliable and unsafe.' );
-        $c->log->warn( 'If you really want to search, pass in a regexp as the argument.' );
+        my $msg = "Used regexp fallback for \$c->model('${name}'), which found '" .
+           (join '", "', @result) . "'. Relying on regexp fallback behavior for " .
+           "component resolution is unreliable and unsafe.";
+        my $short = $result[0];
+        $short =~ s/.*?Model:://;
+        my $shortmess = Carp::shortmess('');
+        if ($shortmess =~ m#Catalyst/Plugin#) {
+           $msg .= " You probably need to set '$short' instead of '${name}' in this " .
+              "plugin's config";
+        } elsif ($shortmess =~ m#Catalyst/lib/(View|Controller)#) {
+           $msg .= " You probably need to set '$short' instead of '${name}' in this " .
+              "component's config";
+        } else {
+           $msg .= " You probably meant \$c->model('$short') instead of \$c->model{'${name}'}, " .
+              "but if you really wanted to search, pass in a regexp as the argument " .
+              "like so: \$c->model(qr/${name}/)";
+        }
+        $c->log->warn( "${msg}$shortmess" );
     }
 
     return @result;
@@ -614,11 +624,11 @@ sub model {
     my( $comp, $rest ) = $c->_comp_search_prefixes( undef, qw/Model M/);
 
     if( $rest ) {
-        $c->log->warn( 'Calling $c->model() will return a random model unless you specify one of:' );
+        $c->log->warn( Carp::shortmess('Calling $c->model() will return a random model unless you specify one of:') );
         $c->log->warn( '* $c->config->{default_model} # the name of the default model to use' );
         $c->log->warn( '* $c->stash->{current_model} # the name of the model to use for this request' );
         $c->log->warn( '* $c->stash->{current_model_instance} # the instance of the model to use for this request' );
-        $c->log->warn( 'NB: in version 5.80, the "random" behavior will not work at all.' );
+        $c->log->warn( 'NB: in version 5.81, the "random" behavior will not work at all.' );
     }
 
     return $c->_filter_component( $comp );
@@ -671,7 +681,7 @@ sub view {
         $c->log->warn( '* $c->config->{default_view} # the name of the default view to use' );
         $c->log->warn( '* $c->stash->{current_view} # the name of the view to use for this request' );
         $c->log->warn( '* $c->stash->{current_view_instance} # the instance of the view to use for this request' );
-        $c->log->warn( 'NB: in version 5.80, the "random" behavior will not work at all.' );
+        $c->log->warn( 'NB: in version 5.81, the "random" behavior will not work at all.' );
     }
 
     return $c->_filter_component( $comp );
@@ -753,7 +763,7 @@ sub component {
         return map { $c->_filter_component( $_, @args ) } @result if ref $name;
 
         if( $result[ 0 ] ) {
-            $c->log->warn( qq(Found results for "${name}" using regexp fallback.) );
+            $c->log->warn( Carp::shortmess(qq(Found results for "${name}" using regexp fallback)) );
             $c->log->warn( 'Relying on the regexp fallback behavior for component resolution' );
             $c->log->warn( 'is unreliable and unsafe. You have been warned' );
             return $c->_filter_component( $result[ 0 ], @args );
@@ -1033,10 +1043,15 @@ EOF
     # modifiers work correctly in MyApp (as you have to call setup _before_ 
     # applying modifiers).
     Scope::Upper::reap(sub {
-        my $meta = $class->Moose::Object::meta();
+        my $meta = Class::MOP::get_metaclass_by_name($class);
         $meta->make_immutable unless $meta->is_immutable;
-    }, 1);
+    }, Scope::Upper::SCOPE(1));
+
+    $class->setup_finalize;
+}
 
+sub setup_finalize {
+    my ($class) = @_;
     $class->setup_finished(1);
 }
 
@@ -2102,7 +2117,7 @@ sub setup_engine {
     }
 
     if ( $ENV{MOD_PERL} ) {
-        my $meta = $class->Class::MOP::Object::meta();
+        my $meta = Class::MOP::get_metaclass_by_name($class);
         
         # create the apache method
         $meta->add_method('apache' => sub { shift->engine->apache });
@@ -2252,7 +2267,7 @@ sub setup_log {
 
     my $env_debug = Catalyst::Utils::env_value( $class, 'DEBUG' );
     if ( defined($env_debug) or $levels{debug} ) {
-        $class->Class::MOP::Object::meta()->add_method('debug' => sub { 1 });
+        Class::MOP::get_metaclass_by_name($class)->add_method('debug' => sub { 1 });
         $class->log->debug('Debug messages enabled');
     }
 }
@@ -2276,7 +2291,7 @@ sub setup_stats {
 
     my $env = Catalyst::Utils::env_value( $class, 'STATS' );
     if ( defined($env) ? $env : ($stats || $class->debug ) ) {
-        $class->Class::MOP::Object::meta()->add_method('use_stats' => sub { 1 });
+        Class::MOP::get_metaclass_by_name($class)->add_method('use_stats' => sub { 1 });
         $class->log->debug('Statistics enabled');
     }
 }
@@ -2319,7 +2334,7 @@ the plugin name does not begin with C<Catalyst::Plugin::>.
         $proto->_plugins->{$plugin} = 1;
         unless ($instant) {
             no strict 'refs';
-            if ( my $meta = $class->Class::MOP::Object::meta() ) {
+            if ( my $meta = Class::MOP::get_metaclass_by_name($class) ) {
               my @superclasses = ($plugin, $meta->superclasses );
               $meta->superclasses(@superclasses);
             } else {
@@ -2547,6 +2562,8 @@ ilmari: Dagfinn Ilmari MannsÃ¥ker <ilmari@ilmari.org>
 
 jcamacho: Juan Camacho
 
+jhannah: Jay Hannah <jay@jays.net>
+
 Jody Belka
 
 Johan Lindstrom
@@ -2581,6 +2598,8 @@ sky: Arthur Bergman
 
 the_jester: Jesse Sheidlower
 
+t0m: Tomas Doran <bobtfish@bobtfish.net>
+
 Ulf Edvinsson
 
 willert: Sebastian Willert <willert@cpan.org>