=head1 LEGAL

#===========================================================================
Copyright (C) 2008 by Nik Ogura. All rights reserved.

This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.

Bug reports and comments to nik.ogura@gmail.com. 

#===========================================================================

=head1 NAME

CGI::Lazy::ModPerl

=head1 SYNOPSIS

use CGI::Lazy;
our $q = CGI::Lazy->new({
				tmplDir 	=> "/templates",
				jsDir		=>  "/js",
				plugins 	=> {
					mod_perl => {
						PerlHandler 	=> "ModPerl::Registry",
						saveOnCleanup	=> 1,
					},
					ajax	=>  1,
					dbh 	=> {
						dbDatasource 	=> "dbi:mysql:somedatabase:localhost",
						dbUser 		=> "dbuser",
						dbPasswd 	=> "letmein",
						dbArgs 		=> {"RaiseError" => 1},
					},
					session	=> {
						sessionTable	=> 'SessionData',
						sessionCookie	=> 'frobnostication',
						saveOnDestroy	=> 1,
						expires		=> '+15m',
					},
				},
			});
=head1 DESCRIPTION

Module for handling the wierdness that entails when you move from normal cgi scripting into the wonderful world of mod_perl.

The mod_perl object needs to know which response handler is being used.  This is a manditory argument.

Sessions are saved in a cleanup handler by default, as well as when the Lazy object is destroyed.  (call me paranoid)  If you wish to disable the mod_perl handler save, set saveOnCleanup => 0.  If it's not set, it's the same as if it was set to 1.

=cut

package CGI::Lazy::ModPerl;

use strict;
use warnings;

use CGI::Lazy::Globals;
use Apache2::Const;
use Apache2::RequestUtil;

#------------------------------------------------------------------------------
=head2 _sessionCleanup

Mod_perl cleanup handler for saving session data.  Called automatically if using both mod_perl and session plugins.

=cut

sub _sessionCleanup {
	my $r = shift;
	my $q = shift;

	if ($q->plugin->session) {
		unless ($q->plugin->session->{saveOnDestroy} == 0) {
			$q->session->save if $q->session;
		}
	}

	return Apache2::Const::OK;

}

#------------------------------------------------------------------------------
=head2 new ( q )

Constructor.

=head3 q

CGI::Lazy object

=cut

sub new {
	my $class = shift;
	my $q = shift;

	my $vars = $q->plugin->mod_perl;

	if ($q->plugin->session) {
		#register cleanup handler, so we make damn sure that the session variable is saved
		my $handler = $q->plugin->mod_perl->{PerlHandler};
		my $r = Apache2::RequestUtil->request();
		$r->push_handlers(PerlCleanupHandler	=> \&_sessionCleanup($r, $q));
	}

	return bless {_q => $q, _vars => $vars}, $class;
}

#------------------------------------------------------------------------------
=head2 vars ()

Returns mod_perl object settings from config.

=cut

sub vars {
	my $self = shift;

	return $self->{_vars};
}

1
