NAME
    Catalyst::Plugin::SmartURI - Configurable URIs for Catalyst

SYNOPSIS
    In your lib/MyApp.pm, load the plugin and your other plugins, for
    example:

        use Catalyst qw/
            -Debug
            ConfigLoader
            Static::Simple
            Session
            Session::Store::Memcached
            Session::State::Cookie
            Authentication
            Authorization::Roles
            +CatalystX::SimpleLogin
            SmartURI
        /;

    In your .conf:

        <Plugin::SmartURI>
            disposition host-header   # application-wide
            uri_class   URI::SmartURI # by default
        </Plugin::SmartURI>

    Per request:

        $c->uri_disposition('absolute');

    Methods on URIs:

        <a href="[% c.uri_for('/foo').relative %]" ...

DESCRIPTION
    Configure whether "$c->uri_for" and "$c->req->uri_with" return absolute,
    hostless or relative URIs, or URIs based on the 'Host' header. Also
    allows configuring which URI class to use. Works on application-wide or
    per-request basis.

    This is useful in situations where you're for example, redirecting to a
    lighttpd from a firewall rule, instead of a real proxy, and you want
    your links and redirects to still work correctly.

    To use your own URI class, just subclass URI::SmartURI and set
    "uri_class", or write a class that follows the same interface.

    This plugin installs a custom "$c->request_class", however it does so in
    a way that won't break if you've already set "$c->request_class"
    yourself, ie. by using Catalyst::Action::REST (thanks mst!).

    There is a minor performance penalty in perls older than 5.10, due to
    Class::C3, but only at initialization time.

METHODS
  $c->uri_for
  $c->req->uri_with
    Returns a "$c->uri_class" object (URI::SmartURI by default) in the
    configured "$c->uri_disposition".

  $c->req->uri
    Returns a "$c->uri_class" object. If the context hasn't been prepared
    yet, uses the configured value for "uri_class".

    "$c->req->uri->relative" will be relative to "$c->req->base".

  $c->req->referer
    Returns a "$c->uri_class" object for the referer (or configured
    "uri_class" if there's no context) with reference set to "$c->req->uri"
    if it comes from "$c->req->base".

    In other words, if referer is your app, you can do
    "$c->req->referer->relative" and it will do the right thing.

CONFIGURATION
    In myapp.conf:

        <Plugin::SmartURI>
            disposition absolute
            uri_class   URI::SmartURI
        </Plugin::SmartURI>

    disposition
        One of 'absolute', 'hostless', 'relative' or 'host-header'. Defaults
        to 'absolute'.

        The special disposition 'host-header' uses the value of your 'Host:'
        header.

    uri_class
        The class to use for URIs, defaults to URI::SmartURI.

PER REQUEST
        package MyAPP::Controller::RSSFeed;

        ...

        sub begin : Private {
            my ($self, $c) = @_;

            $c->uri_class('Your::URI::Class::For::Request');
            $c->uri_disposition('absolute');
        }

    $c->uri_disposition('absolute'|'hostless'|'relative'|'host-header')
        Set URI disposition to use for the duration of the request.

    $c->uri_class($class)
        Set the URI class to use for "$c->uri_for" and "$c->req->uri_with"
        for the duration of the request.

EXTENDING
    "$c->prepare_uri" actually creates the URI, which you can override.

SEE ALSO
    URI::SmartURI, Catalyst, URI

AUTHOR
    Rafael Kitover, "<rkitover at cpan.org>"

BUGS
    Please report any bugs or feature requests to
    "bug-catalyst-plugin-smarturi at rt.cpan.org", or through the web
    interface at
    <http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Catalyst-Plugin-SmartURI
    >. I will be notified, and then you'll automatically be notified of
    progress on your bug as I make changes.

SUPPORT
    You can find documentation for this module with the perldoc command.

        perldoc Catalyst::Plugin::SmartURI

    You can also look for information at:

    *   RT: CPAN's request tracker

        <http://rt.cpan.org/NoAuth/Bugs.html?Dist=Catalyst-Plugin-SmartURI>

    *   AnnoCPAN: Annotated CPAN documentation

        <http://annocpan.org/dist/Catalyst-Plugin-SmartURI>

    *   CPAN Ratings

        <http://cpanratings.perl.org/d/Catalyst-Plugin-SmartURI>

    *   Search CPAN

        <http://search.cpan.org/dist/Catalyst-Plugin-SmartURI>

ACKNOWLEDGEMENTS
    from #catalyst:

    vipul came up with the idea

    mst came up with the design and implementation details for the current
    version

    kd reviewed my code and offered suggestions

TODO
    I'd like to extend on Catalyst::Plugin::RequireSSL, and make a plugin
    that rewrites URIs for actions with an SSL attribute.

COPYRIGHT & LICENSE
    Copyright (c) 2008 Rafael Kitover

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

