return function(name, basalt)
    local base = basalt.getObject("Object")(name, basalt)
    local objectType = "Timer"

    local timer = 0
    local savedRepeats = 0
    local repeats = 0
    local timerObj
    local timerIsActive = false

    local object = {
        getType = function(self)
            return objectType
        end,

        setTime = function(self, _timer, _repeats)
            timer = _timer or 0
            savedRepeats = _repeats or 1
            return self
        end,

        getTime = function(self)
            return timer
        end,

        start = function(self)
            if(timerIsActive)then
                os.cancelTimer(timerObj)
            end
            repeats = savedRepeats
            timerObj = os.startTimer(timer)
            timerIsActive = true
            self:listenEvent("other_event")
            return self
        end,

        isActive = function(self)
            return timerIsActive
        end,

        cancel = function(self)
            if (timerObj ~= nil) then
                os.cancelTimer(timerObj)
            end
            timerIsActive = false
            self:removeEvent("other_event")
            return self
        end,

        setStart = function(self, start)
            if (start == true) then
                return self:start()
            else
                return self:cancel()
            end
        end,

        onCall = function(self, func)
            self:registerEvent("timed_event", func)
            return self
        end,

        eventHandler = function(self, event, ...)
            base.eventHandler(self, event, ...)
            if event == "timer" and tObj == timerObj and timerIsActive then
                self:sendEvent("timed_event")
                if (repeats >= 1) then
                    repeats = repeats - 1
                    if (repeats >= 1) then
                        timerObj = os.startTimer(timer)
                    end
                elseif (repeats == -1) then
                    timerObj = os.startTimer(timer)
                end
            end
        end,
    }

    object.__index = object
    return setmetatable(object, base)
end