allow session class to be configurable
[catagits/Web-Session.git] / lib / Plack / Middleware / Session.pm
index 9bbe61c..aeacddc 100644 (file)
@@ -5,29 +5,44 @@ use warnings;
 use Plack::Session;
 use Plack::Request;
 use Plack::Response;
-use Plack::Session::State::Cookie;
-use Plack::Session::Store;
+use Plack::Util;
+use Scalar::Util;
 
 use parent 'Plack::Middleware';
 
-use Plack::Util::Accessor qw( state store );
+use Plack::Util::Accessor qw(
+    state
+    store
+    session_class
+);
 
 sub prepare_app {
     my $self = shift;
-    unless ($self->state) {
-        $self->state( Plack::Session::State::Cookie->new );
-    }
 
-    unless ($self->store) {
-        $self->store( Plack::Session::Store->new );
-    }
+    $self->session_class( 'Plack::Session' ) unless $self->session_class;
+    $self->state( 'Cookie' )                 unless $self->state;
+
+    $self->state( $self->inflate_backend('Plack::Session::State', $self->state) );
+    $self->store( $self->inflate_backend('Plack::Session::Store', $self->store) );
+}
+
+sub inflate_backend {
+    my($self, $prefix, $backend) = @_;
+
+    return $backend if defined $backend && Scalar::Util::blessed $backend;
+
+    my @class;
+    push @class, $backend if defined $backend; # undef means the root class
+    push @class, $prefix;
+
+    Plack::Util::load_class(@class)->new();
 }
 
 sub call {
     my $self = shift;
     my $env  = shift;
 
-    $env->{'plack.session'} = Plack::Session->new(
+    $env->{'plack.session'} = $self->session_class->new(
         state   => $self->state,
         store   => $self->store,
         request => Plack::Request->new( $env )
@@ -54,7 +69,6 @@ Plack::Middleware::Session - Middleware for session management
 =head1 SYNOPSIS
 
   use Plack::Builder;
-  use Plack::Middleware::Session;
 
   my $app = sub {
       return [ 200, [ 'Content-Type' => 'text/plain' ], [ 'Hello Foo' ] ];
@@ -65,12 +79,19 @@ Plack::Middleware::Session - Middleware for session management
       $app;
   };
 
+  # Or, use the File store backend (great if you use multiprocess server)
+  # For more options, see perldoc Plack::Session::Store::File
+  builder {
+      enable 'Session', store => 'File';
+      $app;
+  };
+
 =head1 DESCRIPTION
 
 This is a Plack Middleware component for session management. By
-default it will use cookies to keep session state and store data
-in memory. This distribution comes also comes with other state
-and store solutions.
+default it will use cookies to keep session state and store data in
+memory. This distribution also comes with other state and store
+solutions. See perldoc for these backends how to use them.
 
 =head2 State
 
@@ -104,11 +125,9 @@ This will persist session data in a file. By default it uses
 L<Storable> but it can be configured to have a custom serializer and
 deserializer.
 
-=item L<Plack::Session::Store::CHI>
+=item L<Plack::Session::Store::Cache>
 
-This will persist session data using the L<CHI> module. This
-offers a lot of flexibility due to the many excellent L<CHI>
-drivers available.
+This will persist session data using the L<Cache> interface.
 
 =item L<Plack::Session::Store::Null>