Класс кеширования данных для LUA

-- wow time() func analog   (epochTime sec)
function time()
    return os.time(os.date("!*t")) 
end
 
 
function CacheClass()
    local storage = {}
    local pack, unpack = table.pack, table.unpack
    return function(key, timeout, callback, ...)
        local now = time()
        if storage[key] ~= nil and storage[key][1] > now then
            return unpack(storage[key][2])
        end
        local value = pack(callback(...))
        storage[key] = { now + timeout , value }
        return unpack(value)
    end
end
 
 
-- function(key, timeoutSec, updatefunc)
Cached = CacheClass()
 
 
aa,ab,ac = Cached("debounce5sec", 5, function(a, b, c)
    -- this shall executed
    return 2 * a, 2 * b, 2 * c
end, 2, 4, 16)
print(aa,ab,ac)
 
 
aa,ab,ac = Cached("debounce5sec", 5, function(a, b, c)
    -- this will executed only if 5 sec passed
    return 4 * a, 4 * b, 4 * c
end, 2, 4, 16)
print(aa,ab,ac)