static int invokeFunction(lua_State* L)
    {
        LuaAccess              luaAccess(L);
        RawPtr<LuaInterpreter> luaInterpreter            = luaAccess.getLuaInterpreter();
        LuaAccess              oldLuaAccess              = luaInterpreter->getCurrentLuaAccess();
        int                    oldErrorHandlerStackIndex = luaInterpreter->getErrorHandlerStackIndex();

        LuaInterpreter::LuaCFunctionAccess::setCurrentLuaAccess(luaInterpreter, luaAccess);
#ifdef DEBUG
        OwningPtr<LuaStackChecker> oldChecker = LuaStateAccess::replaceLuaStackChecker(L, LuaStackChecker::create());
#endif

        int numberOfResults = 0;
        bool wasError = false;
        {
            LuaCFunctionArguments args(luaAccess);

            LuaVar errorHandler(luaAccess, LuaCClosure::create<&LuaInterpreter::errorHandlerFunction>());
            LuaInterpreter::LuaCFunctionAccess::setErrorHandlerStackIndex(luaInterpreter, errorHandler.getStackIndex());

            try
            {

                numberOfResults = (C::getInstance()->*M)(args).numberOfResults;
            }
            catch (...)
            {
                LuaCMethodBase::handleException(luaAccess,
                                                LuaClassRegistry::ClassAttributes<C>::getLuaClassName(),
                                                LuaClassRegistry::getMethodName<C,M>());
                wasError = true;
            }
        }
#ifdef DEBUG
        LuaStateAccess::replaceLuaStackChecker(L, oldChecker);
#endif
        LuaInterpreter::LuaCFunctionAccess::setErrorHandlerStackIndex(luaInterpreter, oldErrorHandlerStackIndex);
        LuaInterpreter::LuaCFunctionAccess::setCurrentLuaAccess      (luaInterpreter, oldLuaAccess);

        if (wasError) {
            lua_error(L);
            ASSERT(false);
            return 0;
        } else {
            return numberOfResults;
        }
    }