classes = {}
function define(name, def)
    if def.extends then
        setmetatable(def, get(def.extends))
    end
    classes[name] = def
end
function new(classname, ...)
    local obj = get(classname).new(...)
    obj = setmetatable(obj, {__index = classes[classname]})
    return obj
end
function get(classname)
    return classes[classname]
end
function call(classname, funcname, object, ...)
    if object then
        setfenv(1, object)
        get(classname)[funcname](object, ...)
    else
        setfenv(1, classes[classname])
        get(classname)[funcname](...)
    end
    setfenv(1, _G)
end