class Timer
    {
        private final Timers.Timer delegate;

        Timer(Timers.Timer delegate)
        {
            this.delegate = delegate;
        }

        /**
         * Changes the interval of the timer.
         * <p>
         * This method is slow, canceling existing and adding a new timer yield better performance.
         * @param interval the new interval of the time.
         * @return true if set, otherwise false.
         */
        public boolean setInterval(long interval)
        {
            return delegate.setInterval(interval);
        }

        /**
         * Reset the timer.
         * <p>
         * This method is slow, canceling existing and adding a new timer yield better performance.
         * @return true if reset, otherwise false.
         */
        public boolean reset()
        {
            return delegate.reset();
        }

        /**
         * Cancels a timer.
         *
         * @return true if cancelled, otherwise false.
         */
        public boolean cancel()
        {
            return delegate.cancel();
        }
    }

    private final Timers timer;

    public ZTimer()
    {
        timer = new Timers();
    }

    ZTimer(Supplier<Long> clock)
    {
        timer = new Timers(clock);
    }

    /**
     * Add timer to the set, timer repeats forever, or until cancel is called.
     * @param interval the interval of repetition in milliseconds.
     * @param handler the callback called at the expiration of the timer.
     * @param args the optional arguments for the handler.
     * @return an opaque handle for further cancel.
     */
    public Timer add(long interval, TimerHandler handler, Object... args)
    {<FILL_FUNCTION_BODY>

        if (handler == null) {
            return null;
        }
        return new Timer(timer.add(interval, handler, args));
    
<no_super_class>