}
}
+=item $c->dispatch
+
+Dispatch request to actions.
+
+=cut
+
+sub dispatch {
+ my $c = shift;
+ my $action = $c->req->action;
+ my $namespace = '';
+ $namespace = ( join( '/', @{ $c->req->args } ) || '/' )
+ if $action eq 'default';
+ unless ($namespace) {
+ if ( my $result = $c->get_action($action) ) {
+ $namespace = _class2prefix( $result->[0]->[0]->[0] );
+ }
+ }
+ my $default = $action eq 'default' ? $namespace : undef;
+ my $results = $c->get_action( $action, $default );
+ $namespace ||= '/';
+ if ( @{$results} ) {
+
+ # Execute last begin
+ $c->state(1);
+ if ( my $begin = @{ $c->get_action( 'begin', $namespace ) }[-1] ) {
+ $c->execute( @{ $begin->[0] } );
+ return if scalar @{ $c->error };
+ }
+
+ # Execute the auto chain
+ for my $auto ( @{ $c->get_action( 'auto', $namespace ) } ) {
+ $c->execute( @{ $auto->[0] } );
+ return if scalar @{ $c->error };
+ last unless $c->state;
+ }
+
+ # Execute the action or last default
+ if ( ( my $action = $c->req->action ) && $c->state ) {
+ if ( my $result = @{ $c->get_action( $action, $default ) }[-1] ) {
+ $c->execute( @{ $result->[0] } );
+ }
+ }
+
+ # Execute last end
+ if ( my $end = @{ $c->get_action( 'end', $namespace ) }[-1] ) {
+ $c->execute( @{ $end->[0] } );
+ return if scalar @{ $c->error };
+ }
+ }
+ else {
+ my $path = $c->req->path;
+ my $error = $path
+ ? qq/Unknown resource "$path"/
+ : "No default action defined";
+ $c->log->error($error) if $c->debug;
+ $c->error($error);
+ }
+}
+
=item $c->error
=item $c->error($error, ...)
else { $c->state( &$code( $class, $c, @{ $c->req->args } ) ) }
};
if ( my $error = $@ ) {
- chomp $error;
- $error = qq/Caught exception "$error"/;
+
+ unless ( ref $error ) {
+ chomp $error;
+ $error = qq/Caught exception "$error"/;
+ }
+
$c->log->error($error);
- $c->error($error) if $c->debug;
+ $c->error($error);
$c->state(0);
}
return $c->state;
}
}
for my $result ( @{$results} ) {
- $c->state( $c->execute( @{ $result->[0] } ) );
+ $c->execute( @{ $result->[0] } );
+ return if scalar @{ $c->error };
+ last unless $c->state;
}
return $c->state;
}
my $handler = sub {
my $c = $class->prepare($engine);
$c->{stats} = \@stats;
- my $action = $c->req->action;
- my $namespace = '';
- $namespace = ( join( '/', @{ $c->req->args } ) || '/' )
- if $action eq 'default';
- unless ($namespace) {
- if ( my $result = $c->get_action($action) ) {
- $namespace = _class2prefix( $result->[0]->[0]->[0] );
- }
- }
- my $default = $action eq 'default' ? $namespace : undef;
- my $results = $c->get_action( $action, $default );
- $namespace ||= '/';
- if ( @{$results} ) {
- for my $begin ( @{ $c->get_action( 'begin', $namespace ) } ) {
- $c->state( $c->execute( @{ $begin->[0] } ) );
- }
- if ( my $action = $c->req->action ) {
- for my $result (
- @{ $c->get_action( $action, $default ) }[-1] )
- {
- $c->state( $c->execute( @{ $result->[0] } ) );
- last unless $default;
- }
- }
- for my $end ( reverse @{ $c->get_action( 'end', $namespace ) } )
- {
- $c->state( $c->execute( @{ $end->[0] } ) );
- }
- }
- else {
- my $path = $c->req->path;
- my $error = $path
- ? qq/Unknown resource "$path"/
- : "No default action defined";
- $c->log->error($error) if $c->debug;
- $c->error($error);
- }
+ $c->dispatch;
return $c->finalize;
};
if ( $class->debug ) {
$absolute = 1;
}
$absolute = 1 if $flags{global};
- my $name = $absolute ? $path : "$prefix/$path";
+ my $name = $absolute ? $path : $prefix ? "$prefix/$path" : $path;
$c->actions->{plain}->{$name} = [ $namespace, $code ];
}
if ( my $regex = $flags{regex} ) {
$self->components->{ ref $comp } = $comp;
$self->setup_actions($comp);
}
- my $t = Text::ASCIITable->new({ hide_HeadRow => 1, hide_HeadLine => 1});
+ my $t = Text::ASCIITable->new( { hide_HeadRow => 1, hide_HeadLine => 1 } );
$t->setCols('Class');
$t->setColWidth( 'Class', 75, 1 );
$t->addRow( wrap( $_, 75 ) ) for keys %{ $self->components };
if ( @{ $regexes->{tbl_rows} } && $self->debug );
}
+=item $c->state
+
+Contains the return value of the last executed action.
+
=item $c->stash
Returns a hashref containing all your data.