/usr/local/CPAN/POE-Component-XUL/POE/XUL/EventManager.pm


package POE::XUL::EventManager;

use strict;
use warnings;
use Carp;
use Scalar::Util qw(weaken);
use XUL::Node::Event;

sub new {
	my $class = shift;
	bless { nodes => {} }, $class
}

sub make_event {
	my ($self, $request) = @_;
	my $id = $request->{source};
	croak "cannot make event with no source" unless $id;
	$request->{source} = $self->get_node($id);
	croak "node with id [$id] not found" unless $request->{source};
	return XUL::Node::Event->make_event($request);
}

sub fire_event {
	my ($self, $event) = (shift,shift);
	$event->source->fire_event($event,@_);
}

sub register_node {
	my ($self, $id, $node) = @_;
	my $nodes = $self->{nodes};
	$nodes->{$id} = $node;
	weaken $nodes->{$id};
}

# TODO: cleanup dangling weak ref now and then
sub get_node { shift->{nodes}->{pop()} }

1;