[dancer-users] session() auto-flush

Warren Young warren at etr-usa.com
Fri Feb 14 04:37:20 GMT 2014


I tried passing the return value of session() into a function in another 
module which purposely does not "use Dancer".  Thus, I cannot use the 
global DSL functions without explicit qualification.

This other module modifies the session object, so the code looked 
something like this:


package App::Helper;

sub do_something_interesting {
     my ($session) = @_;

     $session->{foo} = 'bar';
     # ... and lots more like that
}


To my surprise, I found that in the calling route handler...

get '/myroute' => sub {
     do_something_interesting(session());

     session 'more' => 'changes here';
}

...the changes to the session object made by the helper module got lost.

I finally tracked it down to the fact that session(X, Y) automatically 
calls flush() on the object for you, whereas session() with no 
parameters returns a hashref that doesn't auto-flush itself.

On one level, I guess live and learn.  But, is it good design for Dancer 
to simply forget all my changes?  Why doesn't the second line in my 
route handler simply continue to modify the in-memory session object, 
and flush all the changes at once?


More information about the dancer-users mailing list