-- SageClass.lua sage = sage or {} sage.class = sage.class or {} ---------------------------------------------------------------------------------------------------- local rgbHash do local MAX_VALUE = 65536 -- arbitrary local function hash(s) local v = 0 for i=1,s:len() do v = 17 * v + s:byte(i) v = (v < MAX_VALUE) and v or math.floor(math.fmod(v, MAX_VALUE)) end return v / MAX_VALUE end function rgbHash(s) return 0.4 + 0.6 * hash("red" .. s), 0.4 + 0.6 * hash("green" .. s), 0.4 + 0.6 * hash("blue" .. s) end end local Class local function newClass(arg) local name = (arg and arg.name) or tostring(arg) local super = (arg and arg.super) or Class local class = setmetatable({super=super, name=name}, super) class.__index = class class.class = class class.r, class.g, class.b = rgbHash(name) function class:Debug(...) ChatFrame1:AddMessage(table.concat({name, ": ", ...}, " "), class.r, class.g, class.b) end function class:Print(...) ChatFrame1:AddMessage(string.format(...), class.r, class.g, class.b) end -- make sure there is an _Initialize at each class so no super gets called twice function class:_Initialize(instance, ...) self.super:_Initialize(instance, ...) end return class end do local class = newClass{name="Class"} -- default. Many classes will override function class:New(...) -- self is class local class = self local instance = setmetatable({}, self) class:_Initialize(instance, ...) -- calls the subbiest class method first return instance end function class:NewClass(arg) return newClass(arg) end function class:_Instantiate(instance) error("Obsolete") end function class:_Initialize(instance) -- self is class end Class = class end sage.class.Class = Class