remove Store::CHI
[catagits/Web-Session.git] / lib / Plack / Middleware / Session.pm
index d85dd5a..aff0685 100644 (file)
@@ -5,8 +5,8 @@ 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';
 
@@ -14,21 +14,31 @@ use Plack::Util::Accessor qw( state store );
 
 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->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->{'psgix.session'} = Plack::Session->new(
-        state   => $self->state || $self->default_state,
+    $env->{'plack.session'} = Plack::Session->new(
+        state   => $self->state,
         store   => $self->store,
         request => Plack::Request->new( $env )
     );
@@ -36,7 +46,7 @@ sub call {
     my $res = $self->app->($env);
     $self->response_cb($res, sub {
         my $res = Plack::Response->new(@{$_[0]});
-        $env->{'psgix.session'}->finalize( $res );
+        $env->{'plack.session'}->finalize( $res );
         @{$_[0]} = @{$res->finalize};
     });
 }
@@ -44,3 +54,104 @@ sub call {
 1;
 
 __END__
+
+=pod
+
+=head1 NAME
+
+Plack::Middleware::Session - Middleware for session management
+
+=head1 SYNOPSIS
+
+  use Plack::Builder;
+
+  my $app = sub {
+      return [ 200, [ 'Content-Type' => 'text/plain' ], [ 'Hello Foo' ] ];
+  };
+
+  builder {
+      enable 'Session';
+      $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 also comes with other state and store
+solutions. See perldoc for these backends how to use them.
+
+=head2 State
+
+=over 4
+
+=item L<Plack::Session::State>
+
+This will maintain session state by passing the session through
+the request params. It does not do this automatically though,
+you are responsible for passing the session param.
+
+=item L<Plack::Session::State::Cookie>
+
+This will maintain session state using browser cookies.
+
+=back
+
+=head2 Store
+
+=over 4
+
+=item L<Plack::Session::Store>
+
+This is your basic in-memory session data store. It is volatile storage
+and not recommended for multiprocessing environments. However it is
+very useful for development and testing.
+
+=item L<Plack::Session::Store::File>
+
+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::Cache>
+
+This will persist session data using the L<Cache> interface.
+
+=item L<Plack::Session::Store::Null>
+
+Sometimes you don't care about storing session data, in that case
+you can use this noop module.
+
+=back
+
+=head1 BUGS
+
+All complex software has bugs lurking in it, and this module is no
+exception. If you find a bug please either email me, or add the bug
+to cpan-RT.
+
+=head1 AUTHOR
+
+Tatsuhiko Miyagawa
+
+Stevan Little E<lt>stevan.little@iinteractive.comE<gt>
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright 2009 Infinity Interactive, Inc.
+
+L<http://www.iinteractive.com>
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=cut
+
+