use strict;
package Event::timer;
use Carp;
use base 'Event::Watcher';
use vars qw(@ATTRIBUTE);

@ATTRIBUTE = qw(at hard interval);

'Event::Watcher'->register;

sub new {
#    lock %Event::;
    my $class = shift;
    my %arg = @_;
    my $o = allocate($class, delete $arg{attach_to} || {});

    # deprecated
    for (qw(at after interval repeat)) {
	if (exists $arg{"e_$_"}) {
	    carp "'e_$_' is renamed to '$_'";
	    $arg{$_} = delete $arg{"e_$_"};
	}
    }

    my $has_at = exists $arg{at};
    my $has_after = exists $arg{after};

    croak "'after' and 'at' are mutually exclusive"
	if $has_at && $has_after;

    if ($has_after) {
	my $after = delete $arg{after};
	$o->at(Event::time() + $after);
	$has_at=1;
	$o->interval($after) if !exists $arg{interval};
    } elsif ($has_at) {
	$o->at(delete $arg{at});
    }
    if (exists $arg{interval}) {
	my $i = delete $arg{interval};
	$o->at(Event::time() + (ref $i? $$i : $i)) unless $has_at;
	$o->interval($i);
	$o->repeat(1) unless exists $arg{repeat};
    }

    $o->init(\%arg);
    $o->start();
    $o;
}

1;
