| flickerstreak@104 | 1 | 
| flickerstreak@104 | 2 assert(LibStub, "LibDataBroker-1.1 requires LibStub") | 
| flickerstreak@104 | 3 assert(LibStub:GetLibrary("CallbackHandler-1.0", true), "LibDataBroker-1.1 requires CallbackHandler-1.0") | 
| flickerstreak@104 | 4 | 
| flickerstreak@104 | 5 local lib, oldminor = LibStub:NewLibrary("LibDataBroker-1.1", 4) | 
| flickerstreak@104 | 6 if not lib then return end | 
| flickerstreak@104 | 7 oldminor = oldminor or 0 | 
| flickerstreak@104 | 8 | 
| flickerstreak@104 | 9 | 
| flickerstreak@104 | 10 lib.callbacks = lib.callbacks or LibStub:GetLibrary("CallbackHandler-1.0"):New(lib) | 
| flickerstreak@104 | 11 lib.attributestorage, lib.namestorage, lib.proxystorage = lib.attributestorage or {}, lib.namestorage or {}, lib.proxystorage or {} | 
| flickerstreak@104 | 12 local attributestorage, namestorage, callbacks = lib.attributestorage, lib.namestorage, lib.callbacks | 
| flickerstreak@104 | 13 | 
| flickerstreak@104 | 14 if oldminor < 2 then | 
| flickerstreak@104 | 15 	lib.domt = { | 
| flickerstreak@104 | 16 		__metatable = "access denied", | 
| flickerstreak@104 | 17 		__index = function(self, key) return attributestorage[self] and attributestorage[self][key] end, | 
| flickerstreak@104 | 18 	} | 
| flickerstreak@104 | 19 end | 
| flickerstreak@104 | 20 | 
| flickerstreak@104 | 21 if oldminor < 3 then | 
| flickerstreak@104 | 22 	lib.domt.__newindex = function(self, key, value) | 
| flickerstreak@104 | 23 		if not attributestorage[self] then attributestorage[self] = {} end | 
| flickerstreak@104 | 24 		if attributestorage[self][key] == value then return end | 
| flickerstreak@104 | 25 		attributestorage[self][key] = value | 
| flickerstreak@104 | 26 		local name = namestorage[self] | 
| flickerstreak@104 | 27 		if not name then return end | 
| flickerstreak@104 | 28 		callbacks:Fire("LibDataBroker_AttributeChanged", name, key, value, self) | 
| flickerstreak@104 | 29 		callbacks:Fire("LibDataBroker_AttributeChanged_"..name, name, key, value, self) | 
| flickerstreak@104 | 30 		callbacks:Fire("LibDataBroker_AttributeChanged_"..name.."_"..key, name, key, value, self) | 
| flickerstreak@104 | 31 		callbacks:Fire("LibDataBroker_AttributeChanged__"..key, name, key, value, self) | 
| flickerstreak@104 | 32 	end | 
| flickerstreak@104 | 33 end | 
| flickerstreak@104 | 34 | 
| flickerstreak@104 | 35 if oldminor < 2 then | 
| flickerstreak@104 | 36 	function lib:NewDataObject(name, dataobj) | 
| flickerstreak@104 | 37 		if self.proxystorage[name] then return end | 
| flickerstreak@104 | 38 | 
| flickerstreak@104 | 39 		if dataobj then | 
| flickerstreak@104 | 40 			assert(type(dataobj) == "table", "Invalid dataobj, must be nil or a table") | 
| flickerstreak@104 | 41 			self.attributestorage[dataobj] = {} | 
| flickerstreak@104 | 42 			for i,v in pairs(dataobj) do | 
| flickerstreak@104 | 43 				self.attributestorage[dataobj][i] = v | 
| flickerstreak@104 | 44 				dataobj[i] = nil | 
| flickerstreak@104 | 45 			end | 
| flickerstreak@104 | 46 		end | 
| flickerstreak@104 | 47 		dataobj = setmetatable(dataobj or {}, self.domt) | 
| flickerstreak@104 | 48 		self.proxystorage[name], self.namestorage[dataobj] = dataobj, name | 
| flickerstreak@104 | 49 		self.callbacks:Fire("LibDataBroker_DataObjectCreated", name, dataobj) | 
| flickerstreak@104 | 50 		return dataobj | 
| flickerstreak@104 | 51 	end | 
| flickerstreak@104 | 52 end | 
| flickerstreak@104 | 53 | 
| flickerstreak@104 | 54 if oldminor < 1 then | 
| flickerstreak@104 | 55 	function lib:DataObjectIterator() | 
| flickerstreak@104 | 56 		return pairs(self.proxystorage) | 
| flickerstreak@104 | 57 	end | 
| flickerstreak@104 | 58 | 
| flickerstreak@104 | 59 	function lib:GetDataObjectByName(dataobjectname) | 
| flickerstreak@104 | 60 		return self.proxystorage[dataobjectname] | 
| flickerstreak@104 | 61 	end | 
| flickerstreak@104 | 62 | 
| flickerstreak@104 | 63 	function lib:GetNameByDataObject(dataobject) | 
| flickerstreak@104 | 64 		return self.namestorage[dataobject] | 
| flickerstreak@104 | 65 	end | 
| flickerstreak@104 | 66 end | 
| flickerstreak@104 | 67 | 
| flickerstreak@104 | 68 if oldminor < 4 then | 
| flickerstreak@104 | 69 	local next = pairs(attributestorage) | 
| flickerstreak@104 | 70 	function lib:pairs(dataobject_or_name) | 
| flickerstreak@104 | 71 		local t = type(dataobject_or_name) | 
| flickerstreak@104 | 72 		assert(t == "string" or t == "table", "Usage: ldb:pairs('dataobjectname') or ldb:pairs(dataobject)") | 
| flickerstreak@104 | 73 | 
| flickerstreak@104 | 74 		local dataobj = self.proxystorage[dataobject_or_name] or dataobject_or_name | 
| flickerstreak@104 | 75 		assert(attributestorage[dataobj], "Data object not found") | 
| flickerstreak@104 | 76 | 
| flickerstreak@104 | 77 		return next, attributestorage[dataobj], nil | 
| flickerstreak@104 | 78 	end | 
| flickerstreak@104 | 79 | 
| flickerstreak@104 | 80 	local ipairs_iter = ipairs(attributestorage) | 
| flickerstreak@104 | 81 	function lib:ipairs(dataobject_or_name) | 
| flickerstreak@104 | 82 		local t = type(dataobject_or_name) | 
| flickerstreak@104 | 83 		assert(t == "string" or t == "table", "Usage: ldb:ipairs('dataobjectname') or ldb:ipairs(dataobject)") | 
| flickerstreak@104 | 84 | 
| flickerstreak@104 | 85 		local dataobj = self.proxystorage[dataobject_or_name] or dataobject_or_name | 
| flickerstreak@104 | 86 		assert(attributestorage[dataobj], "Data object not found") | 
| flickerstreak@104 | 87 | 
| flickerstreak@104 | 88 		return ipairs_iter, attributestorage[dataobj], 0 | 
| flickerstreak@104 | 89 	end | 
| flickerstreak@104 | 90 end |