Apache-AppSamurai
view release on metacpan or search on metacpan
lib/Apache/AppSamurai/Session.pm view on Meta::CPAN
package Apache::AppSamurai::Session;
use strict;
use warnings;
use vars qw($VERSION @ISA $incl);
$VERSION = substr(q$Revision: 1.9 $, 10, -1);
use Apache::Session;
@ISA = qw( Apache::Session );
$incl = {};
sub populate {
my $self = shift;
# Allow standard Apache::Session syntax, special AppSamurai/<ITEM>
# syntax, or specifying a full module path.
my ($store, $lock, $gen, $ser);
if ($self->{args}->{Store} =~ /^AppSamurai\/([\w\d\_]+?)\s*$/i) {
$store = "Apache::AppSamurai::Session::Store::$1";
} elsif ($self->{args}->{Store} =~ /::/) {
$store = $self->{args}->{Store};
} else {
$store = "Apache::Session::Store::$self->{args}->{Store}";
}
if ($self->{args}->{Lock} =~ /^AppSamurai\/([\w\d\_]+?)\s*$/i) {
$lock = "Apache::AppSamurai::Session::Lock::$1";
} elsif ($self->{args}->{Lock} =~ /::/) {
$lock = $self->{args}->{Lock};
} else {
$lock = "Apache::Session::Lock::$self->{args}->{Lock}";
}
if ($self->{args}->{Generate} =~ /^AppSamurai\/([\w\d\_]+?)\s*$/i) {
$gen = "Apache::AppSamurai::Session::Generate::$1";
} elsif ($self->{args}->{Generate} =~ /::/) {
$gen = $self->{args}->{Generate};
} else {
$gen = "Apache::Session::Generate::$self->{args}->{Generate}";
}
if ($self->{args}->{Serialize} =~ /^AppSamurai\/([\w\d\_]+?)\s*$/i) {
$ser = "Apache::AppSamurai::Session::Serialize::$1";
} elsif ($self->{args}->{Serialize} =~ /::/) {
$ser = $self->{args}->{Serialize};
} else {
$ser = "Apache::Session::Serialize::$self->{args}->{Serialize}";
}
if (!exists $incl->{$store}) {
eval "require $store" || die $@;
$incl->{$store} = 1;
}
if (!exists $incl->{$lock}) {
eval "require $lock" || die $@;
$incl->{$lock} = 1;
}
if (!exists $incl->{$gen}) {
eval "require $gen" || die $@;
eval '$incl->{$gen}->[0] = \&' . $gen . '::generate' || die $@;
eval '$incl->{$gen}->[1] = \&' . $gen . '::validate' || die $@;
}
if (!exists $incl->{$ser}) {
eval "require $ser" || die $@;
eval '$incl->{$ser}->[0] = \&' . $ser . '::serialize' || die $@;
eval '$incl->{$ser}->[1] = \&' . $ser . '::unserialize' || die $@;
}
$self->{object_store} = new $store $self;
$self->{lock_manager} = new $lock $self;
$self->{generate} = $incl->{$gen}->[0];
$self->{validate} = $incl->{$gen}->[1];
$self->{serialize} = $incl->{$ser}->[0];
$self->{unserialize} = $incl->{$ser}->[1];
return $self;
}
1; # End of Apache::AppSamurai::Session
__END__
=head1 NAME
Apache::AppSamurai::Session - Apache::AppSamurai wrapper for Apache::Session
=head1 SYNOPSIS
use Apache::AppSamurai::Session;
# Equivalent to Apache::Session::Flex use:
tie %hash, 'Apache::AppSamurai::Session', $id, {
Store => 'DB_File',
Lock => 'Null',
Generate => 'MD5',
Serialize => 'Storable'
};
# Postgress backend with AppSamurai HMAC-SHA265 generator and
# AES (Rijndael) encrypting serializer.
tie %hash, 'Apache::AppSamurai::Session', $id, {
Store => 'Postgress',
Lock => 'Null',
Generate => 'AppSamurai/HMAC_SHA',
Serialize => 'AppSamurai/CryptBase64'
};
# Wacky setup with imaginary Thinger::Thing::File storage module
# and very real Apache::AppSamurai::Session::Serialize::CryptBase64
# serializer. (This shows the alternate module syntaxes.)
tie %hash 'Apache::AppSamurai::Session', $id, {
Store => 'Thinger::Thing::File',
Lock => 'Null',
Generate => 'Ranom::Garbage',
Serialize => 'AppSamurai/CryptBase64'
};
# you decide!
=head1 DESCRIPTION
This module is a overload of Apache::Session which allows you to specify the
backing store, locking scheme, ID generator, and data serializer at runtime.
You do this by passing arguments in the usual Apache::Session style (see
SYNOPSIS). You may use any of the modules included in this distribution, or
a module of your own making.
In addition to the standard Apache::Session setup, this module allows for
( run in 0.968 second using v1.01-cache-2.11-cpan-39bf76dae61 )