# Remember to update this in Catalyst::Runtime as well!
-our $VERSION = '5.7000';
+our $VERSION = '5.7003';
sub import {
my ( $class, @arguments ) = @_;
=head2 $c->detach( $class, $method, [, \@arguments ] )
+=head2 $c->detach()
+
The same as C<forward>, but doesn't return to the previous action when
processing is finished.
+When called with no arguments it escapes the processing chain entirely.
+
=cut
sub detach { my $c = shift; $c->dispatcher->detach( $c, @_ ) }
$c->model('Foo')->do_stuff;
-If the name is omitted, it will look for a config setting 'default_model',
-or check if there is only one view, and return it if that's the case.
+If the name is omitted, it will look for
+ - a model object in $c->stash{current_model_instance}, then
+ - a model name in $c->stash->{current_model}, then
+ - a config setting 'default_model', or
+ - check if there is only one model, and return it if that's the case.
=cut
return $c->_filter_component( $c->_comp_prefixes( $name, qw/Model M/ ),
@args )
if $name;
- return $c->component( $c->config->{default_model} )
- if $c->config->{default_model};
+ if (ref $c) {
+ return $c->stash->{current_model_instance}
+ if $c->stash->{current_model_instance};
+ return $c->model( $c->stash->{current_model} )
+ if $c->stash->{current_model};
+ return $c->model( $c->config->{default_model} )
+ if $c->config->{default_model};
+ }
return $c->_filter_component( $c->_comp_singular(qw/Model M/), @args );
}
$c->view('Foo')->do_stuff;
-If the name is omitted, it will look for a config setting
-'default_view', or check if there is only one view, and forward to it if
-that's the case.
+If the name is omitted, it will look for
+ - a view object in $c->stash{current_view_instance}, then
+ - a view name in $c->stash->{current_view}, then
+ - a config setting 'default_view', or
+ - check if there is only one view, and return it if that's the case.
=cut
return $c->_filter_component( $c->_comp_prefixes( $name, qw/View V/ ),
@args )
if $name;
- return $c->component( $c->config->{default_view} )
- if $c->config->{default_view};
+ if (ref $c) {
+ return $c->stash->{current_view_instance}
+ if $c->stash->{current_view_instance};
+ return $c->view( $c->stash->{current_view} )
+ if $c->stash->{current_view};
+ return $c->view( $c->config->{default_view} )
+ if $c->config->{default_view};
+ }
return $c->_filter_component( $c->_comp_singular(qw/View V/) );
}
: [] );
$path = $c->dispatcher->uri_for_action($path, $captures);
return undef unless defined($path);
+ $path = '/' if $path eq '';
}
# massage namespace, empty if absolute path
( scalar @args && ref $args[$#args] eq 'HASH' ? pop @args : {} );
for my $value ( values %$params ) {
- my $isa_ref = ref $value;
- if( $isa_ref and $isa_ref ne 'ARRAY' ) {
- croak( "Non-array reference ($isa_ref) passed to uri_for()" );
+ for ( ref $value eq 'ARRAY' ? @$value : $value ) {
+ $_ = "$_";
+ utf8::encode( $_ );
}
- utf8::encode( $_ ) for grep { defined } $isa_ref ? @$value : $value;
};
# join args with '/', or a blank string
my $last = pop( @{ $c->stack } );
if ( my $error = $@ ) {
- if ( $error eq $DETACH ) { die $DETACH if $c->depth > 1 }
+ if ( !ref($error) and $error eq $DETACH ) { die $DETACH if $c->depth > 1 }
else {
unless ( ref $error ) {
no warnings 'uninitialized';
);
for my $component ( sort { length $a <=> length $b } $locator->plugins ) {
- Catalyst::Utils::ensure_class_loaded( $component );
+ Catalyst::Utils::ensure_class_loaded( $component, { ignore_loaded => 1 } );
my $module = $class->setup_component( $component );
my %modules = (