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
|