Module:fun/isCallable

Hello, you have come here looking for the meaning of the word Module:fun/isCallable. In DICTIOUS you will not only get to know all the dictionary meanings for the word Module:fun/isCallable, but we will also tell you about its etymology, its characteristics and you will know how to say Module:fun/isCallable in singular and plural. Everything you need to know about the word Module:fun/isCallable you have here. The definition of the word Module:fun/isCallable will help you to be more precise and correct when speaking or writing your texts. Knowing the definition ofModule:fun/isCallable, as well as those of other words, enriches your vocabulary and provides you with more and better linguistic resources.


local debug_track_module = "Module:debug/track"
local table_get_metamethod_module = "Module:table/getMetamethod"

local require = require
local type = type

local function debug_track(...)
	debug_track = require(debug_track_module)
	return debug_track(...)
end

local function get_metamethod(...)
	get_metamethod = require(table_get_metamethod_module)
	return get_metamethod(...)
end

--[==[
Return {true} if the input is a function or functor (an object which can be called like a function, because it has a {__call} metamethod).

Note: if the input is an object with a {__call} metamethod, but this function is not able to find it because the object's metatable is protected with {__metatable}, then it will return {false} by default, or {nil} if the {allow_maybe} flag is set.]==]
return function(obj, allow_maybe)
	if type(obj) == "function" then
		return true
	end
	-- An object is callable if it has a __call metamethod, so try to get it
	-- with get_metamethod().
	local success, __call = get_metamethod(obj, "__call")
	-- If this succeeds, `obj` will only be callable if the __call metamethod is
	-- a function (i.e. it can't itself be a callable table), so don't recurse
	-- to check it.
	if __call and type(__call) == "function" then
		return true
	-- If not, then the metatable is protected, so it's not possible to know if
	-- `obj` is callable without actually calling it.
	elseif not success then
		debug_track("fun/isCallable/protected metatable")
		if allow_maybe then
			return nil
		end
	end
	return false
end