#ifndef _ECORE_TIMER_EO_H_
#define _ECORE_TIMER_EO_H_

/**
 * Timers are objects that will call a given callback at some point
 * in the future. They may also optionall repeat themselves if the
 * timer callback returns true. If it does not they will be
 * automatically deleted and never called again. Timers require the
 * ecore mainloop to be running and functioning properly. They do not
 * guarantee exact timing, but try to work on a "best effort basis.
 *
 */
#define ECORE_OBJ_TIMER_CLASS ecore_obj_timer_class_get()

const Eo_Class *ecore_obj_timer_class_get(void) EINA_CONST;

/**
 * @def ecore_obj_timer_loop_constructor
 *
 * No description supplied.
 *
 * @param[in] in The time, in seconds, from now when to go off
 * @param[in] func The callback function to call when the timer goes off
 * @param[in] data A pointer to pass to the callback function as its data pointer
 *
 */
EAPI void  ecore_obj_timer_loop_constructor(double in, Ecore_Task_Cb func, const void *data);

/**
 * @def ecore_obj_timer_constructor
 *
 * No description supplied.
 *
 * @param[in] in The time, in seconds, from when the main loop woke up, to go off
 * @param[in] func The callback function to call when the timer goes off
 * @param[in] data A pointer to pass to the callback function as its data pointer
 *
 */
EAPI void  ecore_obj_timer_constructor(double in, Ecore_Task_Cb func, const void *data);

/**
 * @def ecore_obj_timer_interval_set
 *
 * Change the interval the timer ticks off.
 *
 * @param[in] in The new interval in seconds
 *
 */
EAPI void  ecore_obj_timer_interval_set(double in);

/**
 * @def ecore_obj_timer_interval_get
 *
 * Get the interval the timer ticks on.
 *
 *
 */
EAPI double  ecore_obj_timer_interval_get(void);

/**
 * @def ecore_obj_timer_pending_get
 *
 * Get the pending time regarding a timer.
 *
 *
 */
EAPI double  ecore_obj_timer_pending_get(void);

/**
 * @def ecore_obj_timer_reset
 *
 * Reset a timer to its full interval. This effectively makes
 * the timer start ticking off from zero now.
 *
 *
 */
EAPI void  ecore_obj_timer_reset(void);

/**
 * @def ecore_obj_timer_delay
 *
 * Add some delay for the next occurrence of a timer.
 *
 * @param[in] add The amount of time to delay the timer by in seconds
 *
 */
EAPI void  ecore_obj_timer_delay(double add);


#endif