X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Runtime.git;a=blobdiff_plain;f=lib%2FCatalyst.pm;h=13e8d90950edac72d1ee592285cc786cda1f6c28;hp=56eb46e63ab3ced6551b94ed42bae28e146b9f7d;hb=f0ee3380113797aafadaf452920d9d93f01f4aa7;hpb=e7164f21e0bca09c087b84a207b6afc2ae376e06
diff --git a/lib/Catalyst.pm b/lib/Catalyst.pm
index 56eb46e..13e8d90 100644
--- a/lib/Catalyst.pm
+++ b/lib/Catalyst.pm
@@ -17,13 +17,12 @@ use Module::Pluggable::Object ();
use Text::SimpleTable ();
use Path::Class::Dir ();
use Path::Class::File ();
-use Time::HiRes qw/gettimeofday tv_interval/;
use URI ();
use URI::http;
use URI::https;
-use Scalar::Util qw/weaken/;
use Tree::Simple qw/use_weak_refs/;
use Tree::Simple::Visitor::FindByUID;
+use Class::C3::Adopt::NEXT;
use attributes;
use utf8;
use Carp qw/croak carp shortmess/;
@@ -77,7 +76,8 @@ __PACKAGE__->stats_class('Catalyst::Stats');
# Remember to update this in Catalyst::Runtime as well!
-our $VERSION = '5.8000_05';
+our $VERSION = '5.8000_06';
+$VERSION = eval $VERSION;
sub import {
my ( $class, @arguments ) = @_;
@@ -88,6 +88,12 @@ sub import {
my $caller = caller();
return if $caller eq 'main';
+
+ # Kill Adopt::NEXT warnings if we're a non-RC version
+ if ($VERSION !~ /_\d{2}$/) {
+ Class::C3::Adopt::NEXT->unimport(qr/^Catalyst::/);
+ }
+
my $meta = Moose::Meta::Class->initialize($caller);
#Moose->import({ into => $caller }); #do we want to do this?
@@ -357,6 +363,13 @@ Almost the same as C, but does a full dispatch, instead of just
calling the new C<$action> / C<$class-E$method>. This means that C,
C and the method you go to are called, just like a new request.
+In addition both C<< $c->action >> and C<< $c->namespace >> are localized.
+This means, for example, that $c->action methods such as C, C and
+C return information for the visited action when they are invoked
+within the visited action. This is different from the behavior of C
+which continues to use the $c->action object from the caller action even when
+invoked from the callee.
+
C<$c-Estash> is kept unchanged.
In effect, C allows you to "wrap" another action, just as it
@@ -798,8 +811,8 @@ around config => sub {
my $orig = shift;
my $c = shift;
- $c->log->warn("Setting config after setup has been run is not a good idea.")
- if ( @_ and $c->setup_finished );
+ croak('Setting config after setup has been run is not allowed.')
+ if ( @_ and $c->setup_finished );
$c->$orig(@_);
};
@@ -835,13 +848,11 @@ sub debug { 0 }
=head2 $c->dispatcher
-Returns the dispatcher instance. Stringifies to class name. See
-L.
+Returns the dispatcher instance. See L.
=head2 $c->engine
-Returns the engine instance. Stringifies to the class name. See
-L.
+Returns the engine instance. See L.
=head2 UTILITY METHODS
@@ -866,7 +877,7 @@ sub path_to {
=head2 $c->plugin( $name, $class, @args )
-Helper method for plugins. It creates a classdata accessor/mutator and
+Helper method for plugins. It creates a class data accessor/mutator and
loads and instantiates the given class.
MyApp->plugin( 'prototype', 'HTML::Prototype' );
@@ -916,8 +927,8 @@ Catalyst> line.
sub setup {
my ( $class, @arguments ) = @_;
- $class->log->warn("Running setup twice is not a good idea.")
- if ( $class->setup_finished );
+ croak('Running setup more than once')
+ if ( $class->setup_finished );
unless ( $class->isa('Catalyst') ) {
@@ -982,7 +993,8 @@ EOF
my @plugins = map { "$_ " . ( $_->VERSION || '' ) } $class->registered_plugins;
if (@plugins) {
- my $t = Text::SimpleTable->new(74);
+ my $column_width = Catalyst::Utils::term_width() - 6;
+ my $t = Text::SimpleTable->new($column_width);
$t->row($_) for @plugins;
$class->log->debug( "Loaded plugins:\n" . $t->draw . "\n" );
}
@@ -1014,7 +1026,8 @@ EOF
$class->setup_components;
if ( $class->debug ) {
- my $t = Text::SimpleTable->new( [ 63, 'Class' ], [ 8, 'Type' ] );
+ my $column_width = Catalyst::Utils::term_width() - 8 - 9;
+ my $t = Text::SimpleTable->new( [ $column_width, 'Class' ], [ 8, 'Type' ] );
for my $comp ( sort keys %{ $class->components } ) {
my $type = ref $class->components->{$comp} ? 'instance' : 'class';
$t->row( $comp, $type );
@@ -1045,8 +1058,33 @@ EOF
Scope::Upper::reap(sub {
my $meta = Class::MOP::get_metaclass_by_name($class);
$meta->make_immutable unless $meta->is_immutable;
- }, 1);
+ }, Scope::Upper::SCOPE(1));
+
+ $class->setup_finalize;
+}
+
+
+=head2 $app->setup_finalize
+
+A hook to attach modifiers to.
+Using C< after setup => sub{}; > doesn't work, because of quirky things done for plugin setup.
+Also better than C< setup_finished(); >, as that is a getter method.
+
+ sub setup_finalize {
+
+ my $app = shift;
+ ## do stuff, i.e., determine a primary key column for sessions stored in a DB
+
+ $app->next::method(@_);
+
+
+ }
+
+=cut
+
+sub setup_finalize {
+ my ($class) = @_;
$class->setup_finished(1);
}
@@ -1080,7 +1118,7 @@ using C<< $c->req->captures >>.
sub uri_for {
my ( $c, $path, @args ) = @_;
- if ( Scalar::Util::blessed($path) ) { # action object
+ if ( blessed($path) ) { # action object
my $captures = ( scalar @args && ref $args[0] eq 'ARRAY'
? shift(@args)
: [] );
@@ -1258,7 +1296,7 @@ sub welcome_message {
they can save you a lot of work.
script/${prefix}_create.pl -help
Also, be sure to check out the vast and growing
- collection of plugins for Catalyst on CPAN;
+ collection of plugins for Catalyst on CPAN;
you are likely to find what you need there.
@@ -2010,7 +2048,12 @@ sub setup_components {
my @comps = sort { length $a <=> length $b } $locator->plugins;
my %comps = map { $_ => 1 } @comps;
-
+
+ my $deprecated_component_names = grep { /::[CMV]::/ } @comps;
+ $class->log->warn(qq{Your application is using the deprecated ::[MVC]:: type naming scheme.\n}.
+ qq{Please switch your class names to ::Model::, ::View:: and ::Controller: as appropriate.\n}
+ ) if $deprecated_component_names;
+
for my $component ( @comps ) {
# We pass ignore_loaded here so that overlay files for (e.g.)
@@ -2585,6 +2628,8 @@ obra: Jesse Vincent
omega: Andreas Marienborg
+Oleg Kostyuk
+
phaylon: Robert Sedlacek
rafl: Florian Ragwitz