no kidding sherlock
[catagits/Catalyst-Plugin-Session-State-Stash.git] / lib / Catalyst / Plugin / Session / State / Stash.pm
index 155de3f..80f2fe7 100644 (file)
@@ -1,37 +1,45 @@
 package Catalyst::Plugin::Session::State::Stash;
-use base qw/Catalyst::Plugin::Session::State Class::Accessor::Fast/;
+# ABSTRACT: Maintain session IDs using the stash
 
-use strict;
-use warnings;
+use Moose;
+use 5.008;
 use MRO::Compat;
+use namespace::autoclean;
 
-our $VERSION = "0.10";
+extends 'Catalyst::Plugin::Session::State';
 
-BEGIN { __PACKAGE__->mk_accessors(qw/_deleted_session_id _prepared/) }
+our $VERSION = '0.15';
 
-sub _session_stash_key {
-    my ($c) = @_;
+has _deleted_session_id => ( is => 'rw' );
+has _prepared => ( is => 'rw' );
 
-    $c->config->{session}->{stash_key};
+sub _stash_key_components {
+    my ($c) = @_;
+    my $config = $c->_session_plugin_config;
+    return ($config->{stash_delim}) ?
+        split $config->{stash_delim}, $config->{stash_key} :
+        $config->{stash_key};
 }
 
 sub _get_session {
     my ($c) = @_;
-    
-    $c->stash->{$c->_session_stash_key};
+    # This turns the list of path components into a nested tree of hashrefs for obtaining info/storing in: 123/456 = {123}->{456}
+    my $ref = $c->stash;
+    $ref = ($ref->{$_} ||= {}) foreach $c->_stash_key_components;
+    $ref;
 }
 
 sub _set_session {
     my ( $c,$key,$value) = @_;
-    
-    $c->stash->{$c->_session_stash_key}->{$key} = $value;
+    $c->_get_session->{$key} = $value;
 }
 
 sub setup_session {
     my $c = shift;
 
-    $c->config->{session}->{stash_key}
-        ||= '_session';
+    $c->maybe::next::method(@_);
+
+    $c->_session_plugin_config->{stash_key} ||= '_session';
 }
 
 sub prepare_action {
@@ -67,7 +75,6 @@ sub get_session_expires {
 
 sub set_session_expires {
     my ( $c, $expires ) = @_;
-    
     $c->_set_session(expires => time() + $expires);
     $c->maybe::next::method($expires)
 }
@@ -75,7 +82,8 @@ sub set_session_expires {
 sub delete_session_id {
     my ($c, $sid ) = @_;
     $c->_deleted_session_id(1);
-    undef $c->{stash}->{$c->_session_stash_key};
+    #Empty the tip
+    %{$c->_get_session} = ();
     $c->maybe::next::method($sid);
 }
 
@@ -85,10 +93,6 @@ __END__
 
 =pod
 
-=head1 NAME
-
-Catalyst::Plugin::Session::State::Stash - Maintain session IDs using the stash
-
 =head1 SYNOPSIS
 
  use Catalyst qw/Session Session::State::Stash Session::Store::Foo/;
@@ -149,30 +153,32 @@ Defaults the C<stash_key> parameter to C<_session>.
 
 The name of the hash key to use. Defaults to C<_session>.
 
+=item stash_delim
+
+If present, splits C<stash_key> at this character to nest. E.g. a C<delim> of '/'
+and C<stash_key> of '123/456' will store it as $c->stash->{123}->{456}
+
 =item expires
-    
+
 How long the session should last in seconds.
 
 =back
 
-For example, you could stick this in MyApp.pm:
+For example, you could stick this in F<MyApp.pm>:
 
-  __PACKAGE__->config( session => {
+  __PACKAGE__->config( 'Plugin::Session' => {
      stash_key  => 'session_id',
   });
 
 =head1 BUGS
 
 You can't delete a session then create a new one. If this is important to you,
-patches welcome. It is not important to me and fixing this for completeness
-is pretty low on my list of priorities.
+patches welcome!
 
-=head1 CAVEATS
-
-Manual work may be involved to make better use of this.
+=for stopwords stateful
 
 If you are writing a stateful web service with
-L<Catalyst::Plugin::Server::XMLRPC>, you will probably only have to deal with 
+L<Catalyst::Plugin::Server::XMLRPC>, you will probably only have to deal with
 loading, as when saving, the ID will already be on the stash.
 
 =head1 SEE ALSO
@@ -180,21 +186,15 @@ loading, as when saving, the ID will already be on the stash.
 L<Catalyst>, L<Catalyst::Plugin::Session>, L<Catalyst::Plugin::Session::State>,
 L<Catalyst::Plugin::Session::State::Cookie> (what you probably want).
 
-=head1 AUTHORS
-
-James Laver E<lt>perl -e 'printf qw/%s@%s.com cpan jameslaver/'E<gt>
-
 =head1 CONTRIBUTORS
 
-This module is derived from L<Catalyst::Plugin::Session::State::Cookie> code.
+=begin :list
 
-Thanks to anyone who wrote code for that.
+* This module is derived from L<Catalyst::Plugin::Session::State::Cookie> code.
+  Thanks to anyone who wrote code for that.
 
-=head1 COPYRIGHT
+* Thanks to Kent Fredric for a patch for nested keys
 
-This program is free software, you can redistribute it and/or modify it
-under the same terms as Perl itself.
+=end :list
 
 =cut
-
-1;