Pass $env in more Middleware APIs so subclasses can do more things flexibly in the...
[catagits/Web-Session.git] / lib / Plack / Session.pm
index 223cf37..e6a1c91 100644 (file)
@@ -2,48 +2,63 @@ package Plack::Session;
 use strict;
 use warnings;
 
-use Plack::Util::Accessor qw[
-    id
-    store
-    state
-];
+our $VERSION   = '0.03';
+our $AUTHORITY = 'cpan:STEVAN';
+
+use Plack::Util::Accessor qw( session options );
 
 sub new {
-    my ($class, %params) = @_;
-    my $request = delete $params{'request'};
-    $params{'id'} = $params{'state'}->get_session_id( $request );
-    bless { %params } => $class;
+    my ($class, $env) = @_;
+    # NOTE: when you make a subclass, be sure to NEVER save $env in
+    # your hash. That will create a circular reference.
+    bless {
+        session => $env->{'psgix.session'},
+        options => $env->{'psgix.session.options'},
+    }, $class;
+}
+
+sub id {
+    my $self = shift;
+    $self->options->{id};
 }
 
 ## Data Managment
 
+sub dump {
+    my $self = shift;
+    $self->session;
+}
+
 sub get {
     my ($self, $key) = @_;
-    $self->store->fetch( $self->id, $key )
+    $self->session->{$key};
 }
 
 sub set {
     my ($self, $key, $value) = @_;
-    $self->store->store( $self->id, $key, $value );
+    delete $self->options->{no_store};
+    $self->session->{$key} = $value;
 }
 
 sub remove {
     my ($self, $key) = @_;
-    $self->store->delete( $self->id, $key );
+    delete $self->options->{no_store};
+    delete $self->session->{$key};
+}
+
+sub keys {
+    my $self = shift;
+    keys %{$self->session};
 }
 
 ## Lifecycle Management
 
 sub expire {
     my $self = shift;
-    $self->store->cleanup( $self->id );
-    $self->state->expire_session_id( $self->id );
-}
-
-sub finalize {
-    my ($self, $response) = @_;
-    $self->store->persist( $self->id, $response );
-    $self->state->finalize( $self->id, $response );
+    for my $key ($self->keys) {
+        delete $self->session->{$key};
+    }
+    $self->options->{expire} = 1;
 }
 
 1;
@@ -58,24 +73,47 @@ Plack::Session - Middleware for session management
 
 =head1 SYNOPSIS
 
-  use Plack::Session;
+  # Use with Middleware::Session
+  enable "Session", session_class => "Plack::Session";
+
+  my $app = sub {
+      my $env = shift;
+      my $session = $env->{'plack.session'}; # not psgix.
+
+      $session->id;
+      $session->get($key);
+      $session->set($key, $value);
+      $session->remove($key);
+      $session->keys;
+
+      $session->expire;
+  };
 
 =head1 DESCRIPTION
 
+This is the core session object, you probably want to look
+at L<Plack::Middleware::Session>, unless you are writing your
+own session middleware component.
+
 =head1 METHODS
 
 =over 4
 
-=item B<new ( %params )>
+=item B<new ( $env )>
 
-=item B<id>
+The constructor takes a PSGI request env hash reference.
 
-=item B<state>
+=item B<id>
 
-=item B<store>
+This is the accessor for the session id.
 
 =back
 
+=head2 Session Data Management
+
+These methods allows you to read and write the session data like
+Perl's normal hash.
+
 =over 4
 
 =item B<get ( $key )>
@@ -84,13 +122,19 @@ Plack::Session - Middleware for session management
 
 =item B<remove ( $key )>
 
+=item B<keys>
+
+=item B<session>, B<dump>
+
 =back
 
+=head2 Session Lifecycle Management
+
 =over 4
 
 =item B<expire>
 
-=item B<finalize ( $response )>
+This method can be called to expire the current session id.
 
 =back
 
@@ -106,7 +150,7 @@ Stevan Little E<lt>stevan.little@iinteractive.comE<gt>
 
 =head1 COPYRIGHT AND LICENSE
 
-Copyright 2009 Infinity Interactive, Inc.
+Copyright 2009, 2010 Infinity Interactive, Inc.
 
 L<http://www.iinteractive.com>