YAML support is back, yay!
[catagits/Catalyst-Runtime.git] / lib / Catalyst.pm
index 00e62fa..8fedc9c 100644 (file)
@@ -21,8 +21,7 @@ use Scalar::Util qw/weaken/;
 use Tree::Simple qw/use_weak_refs/;
 use Tree::Simple::Visitor::FindByUID;
 use attributes;
-use JSON;
-use File::Slurp;
+use YAML ();
 
 __PACKAGE__->mk_accessors(
     qw/counter request response state action stack namespace/
@@ -53,7 +52,7 @@ our $CATALYST_SCRIPT_GEN = 26;
 
 __PACKAGE__->mk_classdata($_)
   for qw/components arguments dispatcher engine log dispatcher_class
-  engine_class context_class request_class response_class/;
+  engine_class context_class request_class response_class setup_finished/;
 
 __PACKAGE__->dispatcher_class('Catalyst::Dispatcher');
 __PACKAGE__->engine_class('Catalyst::Engine::CGI');
@@ -373,7 +372,7 @@ sub component {
             if ( exists $c->components->{$try} ) {
 
                 my $comp = $c->components->{$try};
-                if ( ref $comp && $comp->can('ACCEPT_CONTEXT') ) {
+                if ( eval { $comp->can('ACCEPT_CONTEXT'); } ) {
                     return $comp->ACCEPT_CONTEXT($c);
                 }
                 else { return $comp }
@@ -447,14 +446,24 @@ sub view {
 
 Returns or takes a hashref containing the application's configuration.
 
-    __PACKAGE__->config({ db => 'dsn:SQLite:foo.db' });
+    __PACKAGE__->config( { db => 'dsn:SQLite:foo.db' } );
 
-You can also use a L<JSON> config file like myapp.json in your
+You can also use a L<YAML> config file like myapp.yml in your
 applications home directory.
 
-    {
-        "db": "dsn:SQLite:foo.db"
-    }
+    ---
+    db: dsn:SQLite:foo.db
+
+=cut
+
+sub config {
+    my $c = shift;
+
+    $c->log->warn("Setting config after setup has been run is not a good idea.")
+      if ( @_ and $c->setup_finished );
+
+    $c->NEXT::config(@_);
+}
 
 =head2 $c->debug
 
@@ -592,15 +601,12 @@ sub setup {
 
     $class->setup_home( delete $flags->{home} );
 
-    # JSON config support
+    # YAML config support
     my $confpath = $class->config->{file}
       || $class->path_to(
-        ( Catalyst::Utils::appprefix( ref $class || $class ) . '.json' ) );
+        ( Catalyst::Utils::appprefix( ref $class || $class ) . '.yml' ) );
     my $conf = {};
-    if ( -f $confpath ) {
-        my $content = read_file("$confpath");
-        $conf = jsonToObj($content);
-    }
+    $conf = YAML::LoadFile($confpath) if -f $confpath;
     my $oldconf = $class->config;
     $class->config( { %$oldconf, %$conf } );
 
@@ -693,6 +699,8 @@ EOF
         $class->log->info("$name powered by Catalyst $Catalyst::VERSION");
     }
     $class->log->_flush() if $class->log->can('_flush');
+
+    $class->setup_finished(1);
 }
 
 =head2 $c->uri_for( $path, [ @args ] )
@@ -1585,7 +1593,7 @@ sub setup_components {
         }
 
         Catalyst::Exception->throw( message =>
-qq/Couldn't instantiate component "$component", "new() didn't return a object"/
+qq/Couldn't instantiate component "$component", "COMPONENT() didn't return a object"/
           )
           unless ref $instance;
         return $instance;