Quantcast
-- SageClass.lua

local function namespace(s)
  local result = _G
  for name in s:gmatch("%w+") do
    result[name] = result[name] or {}
    result = result[name]
  end
  return result
end

namespace("sage.class").namespace = namespace

----------------------------------------------------------------------------------------------------
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

namespace("sage.class").Class = Class