-- From http://lua-users.org/wiki/SimpleLuaClasses
-- (with some modifications)

-- class.lua
-- Compatible with Lua 5.1 (not 5.0).
return function(base)
	local c = { }    -- a new class instance
	if type(base) == 'table' then
		-- our new class is a shallow copy of the base class!
		if base._preload then
			base = base._preload(base)
		end
		for i,v in pairs(base) do
			c[i] = v
		end
		c._base = base
	end
	-- the class will be the metatable for all its objects,
	-- and they will look up their methods in it.
	c.__index = c

	-- expose a constructor which can be called by <classname>(<args>)
	setmetatable(c, {
		__call = function(class_tbl, ...)
			local obj = { }
			setmetatable(obj,c)
			if class_tbl.init then
				class_tbl.init(obj, ...)
			else
				-- make sure that any stuff from the base class is initialized!
				if base and base.init then
					base.init(obj, ...)
				end
			end
			return obj
		end
	})

	c.is_a =
		function(self, klass)
			local m = getmetatable(self)
			while m do
				if m == klass then return true end
				m = m._base
			end
			return false
		end
	return c
end
