NAME
    CGI::Application::Plugin::Header - Plugin for handling header props.

SYNOPSIS
      package MyApp;
      use parent 'CGI::Application';
      use CGI::Application::Plugin::Header;

      sub do_something {
          my $self = shift;

          my $header = $self->header; # => CGI::Header object

          # get header props.
          my $type = $header->type; # => "text/plain"

          # set header props.
          $header->type("text/html");

          # compatible with the core methods of CGI::Application
          $self->header_props( type => "text/plain" );
          $self->header_add( type => "text/plain" );

          ...
      }

DESCRIPTION
    This plugin provides you the common syntax to handle CGI.pm-compatible
    HTTP header properties.

    By using this plugin, your application is capable of the following
    methods, where $cgiapp denotes the instance of your application which
    inherits from CGI::Application:

  ATTRIBUTES
    $header = $cgiapp->header
        Returns a CGI::Header object associated with $cgiapp. You can use
        all methods of $header.

          sub cgiapp_postrun {
              my ( $self, $body_ref ) = @_;
              $self->header->set( 'Content-Length' => length $$body_ref );
          }

    $header = $cgiapp->header( CGI::Header->new(...) )
        You can also define your "header" class which inherits from
        "CGI::Header". For example,

          package MyApp::Header;
          use parent 'CGI::Header';
          use CGI::Cookie;

          sub cookies {
              my $self    = shift;
              my $cookies = $self->header->{cookies} ||= [];

              return $cookies unless @_;

              if ( ref $_[0] eq 'HASH' ) {
                  push @$cookies, map { CGI::Cookie->new($_) } @_;
              }
              else {
                  push @$cookies, CGI::Cookie->new( @_ );
              }

              $self;
          }

        You can set "header" as follows:

          # using new()

          my $query  = CGI->new;
          my $header = MyApp::Header->new( query => $query );
          my $app    = MyApp->new( query => $query, header => $header );


          # using header()

          my $app = MyApp->new;

          $app->header( MyApp::Header->new( query => $app->query ) );

  METHODS
    This plugin overrides the following methods of CGI::Application:

    %header_props = $cgiapp->header_props
    %header_props = $cgiapp->header_props( $k1 => $v1, $k2 => $v2, ... )
    %header_props = $cgiapp->header_props({ $k1 => $v1, $k2 => $v2, ... })
    %header_props = $cgiapp->header_props({})
        Behaves like CGI::Application's "header_props" method, but the
        return format is modified. "keys" of %header_props are lowercased
        and start with a dash. The following aliases are used:

          '-content-type' -> '-type'
          '-cookie'       -> '-cookies'

        It's guaranteed that the keys are unique.

    $cgiapp->header_add( $k1 => $v1, $k2 => $v2, ... )
    $cgiapp->header_add({ $k1 => $v1, $k2 => $v2, ... })
        Behaves like CGI::Application's "header_add" method.

  COMPATIBILITY
    Header property names are normalized by $header automatically, and so
    this plugin breaks your code which depends on the return value of
    "header_props":

      my %header_props = $cgiapp->header_props; # => ( -cookies => 'ID=123456' )

      if ( exists $header_props{-cookie} ) {
          ...
      }

    Those codes can be rewritten using $header as well as "header_props" or
    "header_add":

      if ( $cgiapp->header->exists('-cookie') ) {
          ...
      }

    The following plugins are compatible with this module:

    CGI::Application::Plugin::Redirect

    The following plugins are roughly compatible with this module:

    CGI::Application::Plugin::Stream
        "Setting a custom Content-Length/-Content-Length header" is not
        supported by this module. In other words, the "stream_file" method
        always overwrites the "Content-Length" header.

    CGI::Application::Plugin::Session
        You need to overwrite the "alias" table of "CGI::Header":

          use parent 'CGI::Header';

          sub _build_alias {
              +{
                  'cookies'      => 'cookie',
                  'content-type' => 'type',
              };
          }

          sub cookies {
              my $self = shift;
              return $self->header->{cookies} unless @_;
              $self->header->{cookies} = shift;
              $self;
          }

          sub cookie {
              my $self = shift;
              $self->cookies(@_);
          }

AUTHOR
    Ryo Anazawa (anazawa@cpan.org)

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

