local NumericArgument = {}

--------------------------------------------------------------------------------

function NumericArgument.validateNonNegativeInteger(paramName, skipStack, index, ...)

    local msg

    local value = select(index, ...)

    if select('#', ...) < index then
        msg = 'not enough arguments'
    elseif type(value) ~= 'number' then
        msg = 'type() is not a number'
    elseif value < -0 then
        msg = 'less than zero'
    elseif value ~= value then
        msg = 'NaN'
    elseif value + 1 == value or value - 1 == value then
        msg = 'exceeds integer safe range'
    elseif math.floor(value) ~= value then
        msg = 'not an integer'
    end

    if msg then

        msg = string.format("%s must be a non-negative integer (%s)",
            paramName or "unknown param",
            msg)

        error(msg, skipStack and skipStack + 1 or 1)

    end

    return value

end

--------------------------------------------------------------------------------

return NumericArgument
