in reply to Re^3: RFC Singleton Sessions
in thread RFC Singleton Sessions

[id://perrin]. Yep clear. Basically, borrowing from Apache::Singleton, here's the relevant code.

package My::Session; ... use vars qw( $GLOBAL_SESSION ); ... sub new { my( $class, $args ) = @_; $args->{log} ||= My::Log->new(); my $instance = $class->_get_instance( $args ); unless( defined $instance ) { $instance = $class->_new_instance( $args ); $class->_set_instance( $instance ); } return $instance; } sub _get_instance { my( $class, $args ) = @_; if( $ENV{MOD_PERL} ) { $args->{log}->debug( "Getting mod_perl session instance" ); my $req = Apache->request(); my $key = "$class\::_instance"; return $req->pnotes( $key ); } else { $args->{log}->debug( "Getting cgi session instance" ); return $GLOBAL_SESSION; } } sub _new_instance { my( $class, $args ) = @_; my $self = {}; $self->{log} = $args->{log}; $self->{log}->debug( "creating new session instance" ); bless $self, $class; # call method to load access privs here return $self; } sub _set_instance { my( $class, $instance ) = @_; if( $ENV{MOD_PERL} ) { $instance->{log}->debug( "setting new mod_perl instance" ); my $req = Apache->request(); my $key = "$class\::_instance"; $req->pnotes( $key, $instance ); } else { $instance->{log}->debug( "setting new cgi instance" ); $GLOBAL_SESSION = $instance; } }

-derby