=pod

=head1 NAME

SDL::Time - An SDL Perl extension for managing timers

=head1 CATEGORY

Core

=head1 SYNOPSIS

 use warnings;
 use strict;
 
 use threads;
 use threads::shared;

 use SDL::Time;

 package foo;

 use SDL ':all';

 SDL::init(SDL_INIT_TIMER);

 my $tick :shared = 0;
 sub ticker { $tick++; warn $tick; return 100; }

 package main;

 my $id = SDL::Time::add_timer(100, 'foo::ticker');

 sleep(2);

 SDL::Time::remove_timer($id);

=head1 METHODS

=head2 add_timer

 my $id = SDL::Timer::add_timer( $ms_interval, $callback );

This runs in a separate thread and a cloned Perl thread.
C<threads> and C<threads::shared> must be used to share any variables the timer uses.

The C<$callback> function, specified with a string of the function's name, will be called after the milliseconds of C<$interval> have elapsed.
The actual delay may be longer than specified depending on the underlying OS.
The callback function is passed the current timer interval as well as the C<$interval> parameter and should return the next timer interval.
If the return value from the callback is 0, the timer is cancelled; otherwise, the timer will continue to run.

The timer callback function may run in a different thread to your main program, so it shouldn't call any functions from within itself.
You may call SDL::push_event, however.

C<SDL::Time::add_timer> returns the identifier value of the generated timer or undef on error.

B<Note:> You must initialize (C<SDL::init>) the timer subsystem to use this function.

=head2 remove_timer

 SDL::Timer::remove_timer( $id );

The other way to cancel a timer is to use C<SDL::Time::remove_timer> on the C<$id> of a timer.
This ID is the return value of the C<SDL::Time::add_timer> function.

C<SDL::Time::remove_timer> returns C<0> on success or C<-1> on error.

=head1 AUTHORS

See L<SDL/AUTHORS>.

=cut