my %pending; sub set_oneshot_timer { my ($event, $hence) = @_; my $session_id = $poe_kernel->get_active_session()->ID(); return if exists $pending{$session_id}{$event}; $poe_kernel->delay( $event, $hence ); $pending{$session_id}{$event} = 1; } sub caught_oneshot_timer { my $event = shift; my $session_id = $poe_kernel->get_active_session()->ID(); delete $pending{$session_id}{$event}; delete $pending{$session_id} unless keys %{$pending{$session_id}}; } #### sub some_event_handler { # set a timer for 10s from now, unless it's already set set_oneshot_timer( event_to_send => 10 ); } sub handle_timer_event { # caught the timer; clear the flag caught_oneshot_timer($_[STATE]); }