package CatalystX::SimpleLogin::TraitFor::Controller::Login::WithRedirect; use MooseX::MethodAttributes::Role; use namespace::autoclean; requires qw/ redirect_after_login_uri /; around 'redirect_after_login_uri' => sub { my ($orig, $self, $c, @args) = @_; if (!$c->can('session')) { $c->log->warn('No $c->session, cannot do ' . __PACKAGE__); return $self->$orig($c, @args); } return $c->session->{redirect_to_after_login} ? delete $c->session->{redirect_to_after_login} : $self->$orig($c, @args); }; before login_redirect => sub { my ($self, $c, $message) = @_; $c->flash->{error_msg} = $message; # FIXME - Flash horrible $c->session->{redirect_to_after_login} = $c->req->uri->as_string; }; 1; __END__ =head1 NAME CatalystX::SimpleLogin::TraitFor::Controller::Login::WithRedirect - redirect users who login back to the page they originally requested. =head1 SYNOPSIS package MyApp::Controller::NeedsAuth; use Moose; use namespace::autoclean; # One needs to inherit from Catalyst::Controller in order # to get the Does('NeedsLogin') functionality. BEGIN { extends 'Catalyst::Controller'; } sub inbox : Path Does('NeedsLogin') { # Redirects to /login if not logged in my ($self, $c) = @_; $c->stash->{template} = "inbox.tt2"; return; } # Turn on in config MyApp->config('Contoller::Login' => { traits => 'WithRedirect' }); =head1 DESCRIPTION Provides the C action with a wrapper to redirect to a page which needs authentication, from which the user was previously redirected. Goes hand in hand with L =head1 WRAPPED METHODS =head2 redirect_after_login_uri Make it use and extract C<< $c->session->{redirect_to_after_login} >> if it exists. =head1 METHODS =head2 $controller->login_redirect($c, $message) This sets the error message to $message and sets C<< $c->session->{redirect_to_after_login} >> to the current URL. =head1 SEE ALSO =over =item L =item L =back =head1 AUTHORS See L for authors. =head1 LICENSE See L for license. =cut