         )
 class Date.Observer extends Date.IntervalTimer
     @_error: new Error()
-    constructor: (fun) ->
-        super(100)
+    constructor: ->
+        [options, fun] =
+            if typeof arguments[0] == "object"
+                [arguments[0], arguments[1]]
+            else
+                [arguments[1], arguments[0]]
+        clonedOptions = if options? then Object.clone(options) else {}
+        clonedOptions.interval ?= 100
+        super(options)
         @_fun = fun
         @onChange = eventField()
         @onUpdate = eventField()

    @getPrecision: ->
        Date.Timer._precision
    @_onCheck: eventField()
    constructor: (@targetTime = Date.Timer._endOfTime) ->
        @_counter = 0
        @_running = false
        @allowsEqual = true
        @onArrive = eventField()
    run: ->
        if @_running then return

    resetCounter: -> @_counter = 0
    getCounter: -> @_counter
class Date.IntervalTimer extends Date.Timer
    constructor: (options) ->
        super(options)
        @interval = options?.interval ? 1000
        @startTime = options?.startTime ? new Date()
        @endTime = options?.endTime ? Date.Timer._endOfTime.subtract(1000)
        @includesStart = options?.includesStart ? true
        @includesEnd = options?.includesEnd ? false
        @skipsPast = options?.skipsPast ? false
        @targetTime = @startTime
        @_started = false
        @onStart = eventField()
        @onArrive.bind((event) =>
            if @interval < Date.Timer.getPrecision() * 2
                @stop()
                return
            now = new Date()
            @targetTime =
                if @skipsPast
                    now - (now - event.idealTime) % @interval + @interval
                else
                    event.idealTime.add(@interval)
            if not @_started
                @_started = true
                if not @includesStart
                    @resetCounter()
                    event.blocksListeners = true
                @onStart.fire()
            if (
                if @includesEnd
                    @targetTime > @endTime
                else
