Added plugin() method for instant plugins
[catagits/Catalyst-Runtime.git] / lib / Catalyst.pm
index 3c9cf83..0f7cd81 100644 (file)
@@ -4,12 +4,12 @@ use strict;
 use base 'Catalyst::Base';
 use UNIVERSAL::require;
 use Catalyst::Log;
-use Catalyst::Helper;
 use Text::ASCIITable;
+our $CATALYST_SCRIPT_GEN = 2;
 
 __PACKAGE__->mk_classdata($_) for qw/dispatcher engine log/;
 
-our $VERSION = '5.00';
+our $VERSION = '5.03';
 our @ISA;
 
 =head1 NAME
@@ -171,9 +171,7 @@ sub import {
           . "Please update your scripts by regenerating the "
           . "application and copying over the new scripts." )
       if ( $ENV{CATALYST_SCRIPT_GEN}
-        && (
-            $ENV{CATALYST_SCRIPT_GEN} < $Catalyst::Helper::CATALYST_SCRIPT_GEN )
-      );
+        && ( $ENV{CATALYST_SCRIPT_GEN} < $CATALYST_SCRIPT_GEN ) );
 
     # Process options
     my @plugins;
@@ -216,19 +214,6 @@ sub import {
     $caller->log->debug( 'Loaded plugins', $t->draw )
       if ( @plugins && $caller->debug );
 
-    # Engine
-    $engine = "Catalyst::Engine::$ENV{CATALYST_ENGINE}"
-      if $ENV{CATALYST_ENGINE};
-
-    $engine->require;
-    die qq/Couldn't load engine "$engine", "$@"/ if $@;
-    {
-        no strict 'refs';
-        push @{"$caller\::ISA"}, $engine;
-    }
-    $caller->engine($engine);
-    $caller->log->debug(qq/Loaded engine "$engine"/) if $caller->debug;
-
     # Dispatcher
     $dispatcher = "Catalyst::Dispatcher::$ENV{CATALYST_DISPATCHER}"
       if $ENV{CATALYST_DISPATCHER};
@@ -242,6 +227,18 @@ sub import {
     $caller->dispatcher($dispatcher);
     $caller->log->debug(qq/Loaded dispatcher "$dispatcher"/) if $caller->debug;
 
+    # Engine
+    $engine = "Catalyst::Engine::$ENV{CATALYST_ENGINE}"
+      if $ENV{CATALYST_ENGINE};
+
+    $engine->require;
+    die qq/Couldn't load engine "$engine", "$@"/ if $@;
+    {
+        no strict 'refs';
+        push @{"$caller\::ISA"}, $engine;
+    }
+    $caller->engine($engine);
+    $caller->log->debug(qq/Loaded engine "$engine"/) if $caller->debug;
 }
 
 =item $c->engine
@@ -259,15 +256,37 @@ C<Catalyst::Log> object.  To use your own log class:
 Your log class should implement the methods described in the C<Catalyst::Log>
 man page.
 
+=item $c->plugin( $name, $class, @args )
+
+Instant plugins for Catalyst.
+Classdata accessor/mutator will be created, class loaded and instantiated.
+
+    MyApp->plugin( 'prototype', 'HTML::Prototype' );
+
+    $c->prototype->define_javascript_functions;
+
+=cut
+
+sub plugin {
+    my ( $class, $name, $plugin, @args ) = @_;
+    $plugin->require;
+    my $error = $UNIVERSAL::require::ERROR;
+    die qq/Couldn't load instant plugin "$plugin", "$error"/ if $error;
+    eval { $plugin->import };
+    $class->mk_classdata($name);
+    my $obj;
+    eval { $obj = $plugin->new(@args) };
+    die qq/Couldn't instantiate instant plugin "$plugin", "$@"/ if $@;
+    $class->$name($obj);
+    $class->log->debug(qq/Initialized instant plugin "$plugin" as "$name"/)
+      if $class->debug;
+}
 
 =back
 
 =head1 LIMITATIONS
 
-FCGI and mod_perl2 support are considered experimental and may contain bugs.
-
-You may encounter problems accessing the built in test server on public ip
-addresses on the internet, thats because of a bug in HTTP::Daemon.
+mod_perl2 support are considered experimental and may contain bugs.
 
 =head1 SUPPORT
 
@@ -308,7 +327,7 @@ Sebastian Riedel, C<sri@oook.de>
 
 =head1 THANK YOU
 
-Andy Grundman, Andrew Ford, Andrew Ruthven, Christian Hansen,
+Andy Grundman, Andrew Ford, Andrew Ruthven, Autrijus Tang, Christian Hansen,
 Christopher Hicks, Dan Sully, Danijel Milicevic, David Naughton,
 Gary Ashton Jones, Jesse Sheidlower, Johan Lindstrom, Marcus Ramberg,
 Tatsuhiko Miyagawa and all the others who've helped.