/usr/local/CPAN/XUL-Node/XUL/Node/Server/Session.pm


package XUL::Node::Server::Session;

use strict;
use warnings;
use Carp;
use XUL::Node::Application;
use XUL::Node::Server::ChangeManager;
use XUL::Node::Server::EventManager;

# public ----------------------------------------------------------------------

sub new {
	my $class = shift;
	my $self = bless {
		change_manager => XUL::Node::Server::ChangeManager->new,
		event_manager  => XUL::Node::Server::EventManager->new,
		start_time     => time,
		application    => undef,
	}, $class;
	$self->change_manager->event_manager($self->event_manager);
	return $self;
}

sub handle_boot {
	my ($self, $request) = @_;
	$self->{application} = XUL::Node::Application->create($request->{name});
	return $self->run_and_flush(sub { $self->{application}->start });
}

sub handle_event {
	my ($self, $request) = @_;
	my $event = $self->make_event($request);
	return $self->run_and_flush(sub { $event->fire });
}

sub destroy {
	my $self = shift;
	$self->{change_manager}->destroy;
}

# private ---------------------------------------------------------------------

sub run_and_flush  { shift->change_manager->run_and_flush(pop) }
sub make_event     { shift->event_manager->make_event(pop) }
sub change_manager { shift->{change_manager} }
sub event_manager  { shift->{event_manager} }

# testing ---------------------------------------------------------------------

sub get_node { shift->{event_manager}->get_node(pop) }

1;