local Logger = require "cave.log.logger" local FunctionLogger = require "cave.log.function_logger" local Meta = require "cave.meta" local validate = Meta.validate local Table = Meta.Table ---@class cave.ClassLogger : cave.Logger local ClassLogger = Meta.derive("ClassLogger", Logger) ---@param cls_name string function ClassLogger:init(cls_name) local prefix = cls_name Logger.init(self, prefix) end ---@param cls_mt table ---@return cave.ClassLogger function ClassLogger.new(cls_mt) validate { cls_mt = { cls_mt, Table } } local cls_name = Meta.like(cls_mt).repr local logger = setmetatable({}, ClassLogger) logger:init(cls_name) return logger end ---@param args_fmt string? ---@param ... any ---@return cave.FunctionLogger function ClassLogger:call(args_fmt, ...) local dbg_info local fn_name for l = 2, 1, -1 do dbg_info = debug.getinfo(l, "n") fn_name = dbg_info.name if fn_name then break end end if dbg_info.namewhat == "method" then fn_name = self.prefix .. ":" .. fn_name elseif dbg_info.namewhat == "field" then fn_name = self.prefix .. "." .. fn_name end return FunctionLogger.new(fn_name, args_fmt, ...):call() end return ClassLogger