Plack::Component - Base class for PSGI endpoints
package Plack::App::Foo;
use parent qw( Plack::Component );
sub call {
my($self, $env) = @_;
# Do something with $env
my $res = ...; # create a response ...
# return the response
return $res;
}
Plack::Component is the base class shared between Plack::Middleware and Plack::App::*
modules. If you are writing middleware, you should inherit from Plack::Middleware, but if you are writing a Plack::App::* you should inherit from this directly.
You are expected to implement a call
method in your component. This is where all the work gets done. It receives the PSGI $env
hash-ref as an argument and is expected to return a proper PSGI response value.
The constructor accepts either a hash or a hashref and uses that to create the instance. It will call no other methods and simply return the instance that is created.
This method is called by to_app
and is meant as a hook to be used to prepare your component before it is packaged as a PSGI $app
.
This is the method used in several parts of the Plack infrastructure to convert your component into a PSGI $app
. You should not ever need to override this method; it is recommended to use prepare_app
and call
instead.
This is a wrapper for response_cb
in Plack::Util. See "RESPONSE CALLBACK" in Plack::Middleware for details.
Objects for the derived classes (Plack::App::* or Plack::Middleware::*) are created at the PSGI application compile phase using new
, prepare_app
and to_app
, and the created object persists during the web server lifecycle, unless it is running on the non-persistent environment like CGI. call
is invoked against the same object whenever a new request comes in.
You can check if it is running in a persistent environment by checking psgi.run_once
key in the $env
being true (non-persistent) or false (persistent), but it is best for you to write your middleware safely for a persistent environment. To accomplish that, you should avoid saving per-request data like $env
in your object.
The Plack::Middleware module used to inherit from Class::Accessor::Fast, which has been removed in favor of the Plack::Util::Accessor module. When developing new components it is recommended to use Plack::Util::Accessor like so:
use Plack::Util::Accessor qw( foo bar baz );
However, in order to keep backwards compatibility this module provides a mk_accessors
method similar to Class::Accessor::Fast. New code should not use this and use Plack::Util::Accessor instead.