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?