return function(cfg)
	return function(cfgKey, valArray, expectType)
		--[[
		-- Gets a message from the cfg table and formats it if appropriate.
		-- The function raises an error if the value from the cfg table is not
		-- of the type expectType. The default type for expectType is 'string'.
		-- If the table valArray is present, strings such as $1, $2 etc. in the
		-- message are substituted with values from the table keys [1], [2] etc.
		-- For example, if the message "foo-message" had the value 'Foo $2 bar $1.',
		-- message('foo-message', {'baz', 'qux'}) would return "Foo qux bar baz."
		--]]
		local msg = cfg[cfgKey]
		expectType = expectType or 'string'
		if type(msg) ~= expectType then
			error('message: type error in message cfg.' .. cfgKey .. ' (' .. expectType .. ' expected, got ' .. type(msg) .. ')', 2)
		end
		if not valArray then
			return msg
		end
	
		local function getMessageVal(match)
			match = tonumber(match)
			return valArray[match] or error('message: no value found for key $' .. match .. ' in message cfg.' .. cfgKey, 4)
		end
	
		return mw.ustring.gsub(msg, '$([1-9][0-9]*)', getMessageVal)
	end
end