package HTTP::Throwable::Role::Redirect;
our $AUTHORITY = 'cpan:STEVAN';
$HTTP::Throwable::Role::Redirect::VERSION = '0.026';
use Types::Standard qw(Str);

use Moo::Role;

has 'location' => (
    is       => 'ro',
    isa      => Str,
    required => 1,
);

around 'build_headers' => sub {
    my $next    = shift;
    my $self    = shift;
    my $headers = $self->$next( @_ );
    push @$headers => ('Location' => $self->location);

    return $headers;
};

no Moo::Role; 1;

=pod

=encoding UTF-8

=head1 NAME

HTTP::Throwable::Role::Redirect - an exception that is a redirect

=head1 VERSION

version 0.026

=head1 OVERVIEW

This is an extremely simple method used by most of the 3xx series of
exceptions.  It adds a C<location> attribute that will be provided as the
Location header when the exception is converted to an HTTP message.

Note that "MultipleChoices," the 300 status code is I<not> currently a
redirect, as its Location header is optional.  This may change in the future of
the semantics of this role are refined.

=head1 AUTHORS

=over 4

=item *

Stevan Little <stevan.little@iinteractive.com>

=item *

Ricardo Signes <rjbs@cpan.org>

=back

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2011 by Infinity Interactive, Inc..

This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.

=cut

__END__
# ABSTRACT: an exception that is a redirect

#pod =head1 OVERVIEW
#pod
#pod This is an extremely simple method used by most of the 3xx series of
#pod exceptions.  It adds a C<location> attribute that will be provided as the
#pod Location header when the exception is converted to an HTTP message.
#pod
#pod Note that "MultipleChoices," the 300 status code is I<not> currently a
#pod redirect, as its Location header is optional.  This may change in the future of
#pod the semantics of this role are refined.