Pass $env in more Middleware APIs so subclasses can do more things flexibly in the...
[catagits/Web-Session.git] / lib / Plack / Middleware / Session.pm
index 782220f..d022f70 100644 (file)
@@ -46,23 +46,18 @@ sub call {
 
     my $request = Plack::Request->new($env);
 
-    my($id, $session);
-    if ($id = $self->state->extract($request) and
-        $session = $self->store->fetch($id)) {
+    my($id, $session) = $self->get_session($request);
+    if ($id && $session) {
         $env->{'psgix.session'} = $session;
     } else {
-        $id = $self->state->generate($request);
+        $id = $self->generate_id($request);
         $env->{'psgix.session'} = {};
     }
 
     $env->{'psgix.session.options'} = { id => $id };
 
     if ($self->session_class) {
-        $env->{'plack.session'} = $self->session_class->new(
-            manager => $self,
-            _data   => $env->{'psgix.session'},
-            options => $env->{'psgix.session.options'},
-        );
+        $env->{'plack.session'} = $self->session_class->new($env);
     }
 
     my $res = $self->app->($env);
@@ -75,10 +70,28 @@ sub call {
     });
 }
 
+sub get_session {
+    my($self, $request) = @_;
+
+    my $id = $self->state->extract($request) or return;
+    my $session = $self->store->fetch($id)   or return;
+
+    return ($id, $session);
+}
+
+sub generate_id {
+    my($self, $request) = @_;
+    $self->state->generate($request);
+}
+
 sub commit {
-    my($self, $session, $options) = @_;
+    my($self, $env) = @_;
+
+    my $session = $env->{'psgix.session'};
+    my $options = $env->{'psgix.session.options'};
+
     if ($options->{expire}) {
-        $self->store->cleanup($options->{id});
+        $self->store->remove($options->{id});
     } else {
         $self->store->store($options->{id}, $session);
     }
@@ -87,14 +100,27 @@ sub commit {
 sub finalize {
     my($self, $env, $response) = @_;
 
-    $self->commit($env->{'psgix.session'}, $env->{'psgix.session.options'});
-    if ($env->{'psgix.session.options'}->{expire}) {
-        $self->state->expire_session_id($env->{'psgix.session.options'}->{id}, $response);
+    my $session = $env->{'psgix.session'};
+    my $options = $env->{'psgix.session.options'};
+
+    $self->commit($env) unless $options->{no_store};
+    if ($options->{expire}) {
+        $self->expire_session($options->{id}, $response, $env);
     } else {
-        $self->state->finalize($env->{'psgix.session.options'}->{id}, $response, $env->{'psgix.session.options'});
+        $self->save_state($options->{id}, $response, $env);
     }
 }
 
+sub expire_session {
+    my($self, $id, $res, $env) = @_;
+    $self->state->expire_session_id($id, $res, $env->{'psgix.session.options'});
+}
+
+sub save_state {
+    my($self, $id, $res, $env) = @_;
+    $self->state->finalize($id, $res, $env->{'psgix.session.options'});
+}
+
 1;
 
 __END__