Mercurial > wow > reaction
comparison lib/AceModuleCore-2.0/AceModuleCore-2.0.lua @ 23:dba04d85c799
Added missing files in 1.0 dev tree
author | Flick <flickerstreak@gmail.com> |
---|---|
date | Fri, 07 Mar 2008 22:17:51 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
22:1b9323256a1b | 23:dba04d85c799 |
---|---|
1 --[[ | |
2 Name: AceModuleCore-2.0 | |
3 Revision: $Rev: 43318 $ | |
4 Developed by: The Ace Development Team (http://www.wowace.com/index.php/The_Ace_Development_Team) | |
5 Inspired By: Ace 1.x by Turan (turan@gryphon.com) | |
6 Website: http://www.wowace.com/ | |
7 Documentation: http://www.wowace.com/index.php/AceModuleCore-2.0 | |
8 SVN: http://svn.wowace.com/root/trunk/Ace2/AceModuleCore-2.0 | |
9 Description: Mixin to provide a module system so that modules or plugins can | |
10 use an addon as its core. | |
11 Dependencies: AceLibrary, AceOO-2.0, AceAddon-2.0, AceEvent-2.0 (optional) | |
12 License: LGPL v2.1 | |
13 ]] | |
14 | |
15 local MAJOR_VERSION = "AceModuleCore-2.0" | |
16 local MINOR_VERSION = "$Revision: 43318 $" | |
17 | |
18 if not AceLibrary then error(MAJOR_VERSION .. " requires AceLibrary") end | |
19 if not AceLibrary:IsNewVersion(MAJOR_VERSION, MINOR_VERSION) then return end | |
20 | |
21 if not AceLibrary:HasInstance("AceOO-2.0") then error(MAJOR_VERSION .. " requires AceOO-2.0") end | |
22 | |
23 local function safecall(func, ...) | |
24 local success, err = pcall(func, ...) | |
25 if not success then geterrorhandler()(err:find("%.lua:%d+:") and err or (debugstack():match("\n(.-: )in.-\n") or "") .. err) end | |
26 end | |
27 | |
28 local AceEvent | |
29 local AceOO = AceLibrary:GetInstance("AceOO-2.0") | |
30 local AceModuleCore = AceOO.Mixin { | |
31 "NewModule", | |
32 "HasModule", | |
33 "GetModule", | |
34 "IsModule", | |
35 "IterateModules", | |
36 "IterateModulesWithMethod", | |
37 "CallMethodOnAllModules", | |
38 "SetModuleMixins", | |
39 "SetModuleClass", | |
40 "IsModuleActive", | |
41 "ToggleModuleActive", | |
42 "SetModuleDefaultState", | |
43 } | |
44 local AceAddon | |
45 | |
46 local function getlibrary(lib) | |
47 if type(lib) == "string" then | |
48 return AceLibrary(lib) | |
49 else | |
50 return lib | |
51 end | |
52 end | |
53 | |
54 local new, del | |
55 do | |
56 local list = setmetatable({}, {__mode='k'}) | |
57 function new() | |
58 local t = next(list) | |
59 if t then | |
60 list[t] = nil | |
61 return t | |
62 else | |
63 return {} | |
64 end | |
65 end | |
66 function del(t) | |
67 for k in pairs(t) do | |
68 t[k] = nil | |
69 end | |
70 list[t] = true | |
71 return nil | |
72 end | |
73 end | |
74 | |
75 local iterList = setmetatable({}, {__mode='v'}) | |
76 local modulesWithMethod = setmetatable({}, {__mode='kv'}) | |
77 do | |
78 local function func(t) | |
79 local i = t.i + 1 | |
80 local l = t.l | |
81 local k = l[i] | |
82 if k then | |
83 t.i = i | |
84 return k, l.m[k] | |
85 else | |
86 t = del(t) | |
87 end | |
88 end | |
89 function AceModuleCore:IterateModules() | |
90 local list = iterList[self] | |
91 if not list then | |
92 list = new() | |
93 for k in pairs(self.modules) do | |
94 list[#list+1] = k | |
95 end | |
96 table.sort(list) | |
97 list.m = self.modules | |
98 iterList[self] = list | |
99 end | |
100 local t = new() | |
101 t.i = 0 | |
102 t.l = list | |
103 return func, t, nil | |
104 end | |
105 | |
106 function AceModuleCore:IterateModulesWithMethod(method) | |
107 local masterList = modulesWithMethod[self] | |
108 if not masterList then | |
109 masterList = new() | |
110 modulesWithMethod[self] = masterList | |
111 end | |
112 local list = masterList[method] | |
113 if not list then | |
114 list = new() | |
115 for k, v in pairs(self.modules) do | |
116 if self:IsModuleActive(k) and type(v[method]) == "function" then | |
117 list[#list+1] = k | |
118 end | |
119 end | |
120 table.sort(list) | |
121 list.m = self.modules | |
122 masterList[method] = list | |
123 end | |
124 local t = new() | |
125 t.i = 0 | |
126 t.l = list | |
127 return func, t, nil | |
128 end | |
129 | |
130 --[[---------------------------------------------------------------------------------- | |
131 Notes: | |
132 Safely calls the given method on all active modules if it exists on said modules. This will automatically subvert any errors that occur in the modules. | |
133 Arguments: | |
134 string - the name of the method. | |
135 tuple - the list of arguments to call the method with. | |
136 Example: | |
137 core:CallMethodOnAllModules("OnSomething") | |
138 core:CallMethodOnAllModules("OnSomethingElse", 1, 2, 3, 4) | |
139 ------------------------------------------------------------------------------------]] | |
140 function AceModuleCore:CallMethodOnAllModules(method, ...) | |
141 for name, module in self:IterateModulesWithMethod(method) do | |
142 local success, ret = pcall(module[method], module, ...) | |
143 if not success then | |
144 geterrorhandler()(ret) | |
145 end | |
146 end | |
147 end | |
148 end | |
149 | |
150 --[[---------------------------------------------------------------------------- | |
151 Notes: | |
152 Create a new module, parented to self. | |
153 The module created does, in fact, inherit from AceAddon-2.0. | |
154 Arguments: | |
155 string - name/title of the Module. | |
156 list of mixins the module is to inherit from. | |
157 Example: | |
158 MyModule = core:NewModule('MyModule', "AceEvent-2.0", "AceHook-2.1") | |
159 ------------------------------------------------------------------------------]] | |
160 local tmp = {} | |
161 function AceModuleCore:NewModule(name, ...) | |
162 if not self.modules then | |
163 AceModuleCore:error("CreatePrototype() must be called before attempting to create a new module.", 2) | |
164 end | |
165 AceModuleCore:argCheck(name, 2, "string") | |
166 if name:len() == 0 then | |
167 AceModuleCore:error("Bad argument #2 to `NewModule`, string must not be empty") | |
168 end | |
169 if self.modules[name] then | |
170 AceModuleCore:error("The module %q has already been registered", name) | |
171 end | |
172 | |
173 if iterList[self] then | |
174 iterList[self] = del(iterList[self]) | |
175 end | |
176 | |
177 for i = 1, select('#', ...) do | |
178 tmp[i] = getlibrary((select(i, ...))) | |
179 end | |
180 | |
181 if self.moduleMixins then | |
182 for _,mixin in ipairs(self.moduleMixins) do | |
183 local exists = false | |
184 for _,v in ipairs(tmp) do | |
185 if mixin == v then | |
186 exists = true | |
187 break | |
188 end | |
189 end | |
190 if not exists then | |
191 tmp[#tmp+1] = mixin | |
192 end | |
193 end | |
194 end | |
195 | |
196 local module = AceOO.Classpool(self.moduleClass, unpack(tmp)):new(name) | |
197 self.modules[name] = module | |
198 module.name = name | |
199 module.title = name | |
200 | |
201 AceModuleCore.totalModules[module] = self | |
202 | |
203 if modulesWithMethod[self] then | |
204 for k,v in pairs(modulesWithMethod[self]) do | |
205 modulesWithMethod[self] = del(v) | |
206 end | |
207 end | |
208 | |
209 if type(self.OnModuleCreated) == "function" then | |
210 safecall(self.OnModuleCreated, self, name, module) | |
211 end | |
212 if AceEvent then | |
213 AceEvent:TriggerEvent("Ace2_ModuleCreated", module) | |
214 end | |
215 | |
216 local num = #tmp | |
217 for i = 1, num do | |
218 tmp[i] = nil | |
219 end | |
220 return module | |
221 end | |
222 --[[---------------------------------------------------------------------------------- | |
223 Notes: | |
224 Return whether the module names given are all available in the core. | |
225 Arguments: | |
226 list of strings that are the names of the modules. (typically you'd only check for one) | |
227 Returns: | |
228 * boolean - Whether all the modules are available in the core. | |
229 Example: | |
230 if core:HasModule('Bank') then | |
231 -- do banking | |
232 end | |
233 ------------------------------------------------------------------------------------]] | |
234 function AceModuleCore:HasModule(...) | |
235 for i = 1, select('#', ...) do | |
236 if not self.modules[select(i, ...)] then | |
237 return false | |
238 end | |
239 end | |
240 | |
241 return true | |
242 end | |
243 | |
244 --[[------------------------------------------------------------------------------------ | |
245 Notes: | |
246 Return the module "name" if it exists. | |
247 If the module doesnot exist, an error is thrown. | |
248 Arguments: | |
249 string - the name of the module. | |
250 Returns: | |
251 The module requested, if it exists. | |
252 Example: | |
253 local bank = core:GetModule('Bank') | |
254 ------------------------------------------------------------------------------------]] | |
255 function AceModuleCore:GetModule(name) | |
256 if not self.modules then | |
257 AceModuleCore:error("Error initializing class. Please report error.") | |
258 end | |
259 if not self.modules[name] then | |
260 AceModuleCore:error("Cannot find module %q.", name) | |
261 end | |
262 return self.modules[name] | |
263 end | |
264 | |
265 --[[---------------------------------------------------------------------------------- | |
266 Notes: | |
267 Return whether the given module is actually a module. | |
268 Arguments: | |
269 reference to the module | |
270 Returns: | |
271 * boolean - whether the given module is actually a module. | |
272 Example: | |
273 if core:IsModule(module) then | |
274 -- do something | |
275 end | |
276 -- alternatively | |
277 if AceModuleCore:IsModule(module) then | |
278 -- checks all modules, no matter the parent | |
279 end | |
280 ------------------------------------------------------------------------------------]] | |
281 function AceModuleCore:IsModule(module) | |
282 if self == AceModuleCore then | |
283 return AceModuleCore.totalModules[module] | |
284 elseif type(module) == "table" then | |
285 if module.name and self.modules[module.name] and self.modules[module.name].name == module.name then | |
286 return true | |
287 end | |
288 for k,v in pairs(self.modules) do | |
289 if v == module then | |
290 return true | |
291 end | |
292 end | |
293 return false | |
294 end | |
295 end | |
296 | |
297 --[[---------------------------------------------------------------------------------- | |
298 Notes: | |
299 * Sets the default mixins for a given module. | |
300 * This cannot be called after :NewModule() has been called. | |
301 * This should really only be called if you use the mixins in your prototype. | |
302 Arguments: | |
303 list of mixins (up to 20) | |
304 Example: | |
305 core:SetModuleMixins("AceEvent-2.0", "AceHook-2.0") | |
306 ------------------------------------------------------------------------------------]] | |
307 function AceModuleCore:SetModuleMixins(...) | |
308 if self.moduleMixins then | |
309 AceModuleCore:error('Cannot call "SetModuleMixins" twice') | |
310 elseif not self.modules then | |
311 AceModuleCore:error("Error initializing class. Please report error.") | |
312 elseif next(self.modules) then | |
313 AceModuleCore:error('Cannot call "SetModuleMixins" after "NewModule" has been called.') | |
314 end | |
315 | |
316 self.moduleMixins = { ... } | |
317 for i,v in ipairs(self.moduleMixins) do | |
318 self.moduleMixins[i] = getlibrary(v) | |
319 end | |
320 end | |
321 | |
322 -- #NODOC | |
323 function AceModuleCore:SetModuleClass(class) | |
324 class = getlibrary(class) | |
325 if not AceOO.inherits(class, AceOO.Class) then | |
326 AceModuleCore:error("Bad argument #2 to `SetModuleClass' (Class expected)") | |
327 end | |
328 if not self.modules then | |
329 AceModuleCore:error("Error initializing class. Please report error.") | |
330 end | |
331 if self.customModuleClass then | |
332 AceModuleCore:error("Cannot call `SetModuleClass' twice.") | |
333 end | |
334 self.customModuleClass = true | |
335 self.moduleClass = class | |
336 self.modulePrototype = class.prototype | |
337 end | |
338 | |
339 local mt = {__index=function(self, key) | |
340 self[key] = false | |
341 return false | |
342 end} | |
343 local defaultState = setmetatable({}, {__index=function(self, key) | |
344 local t = setmetatable({}, mt) | |
345 self[key] = t | |
346 return t | |
347 end}) | |
348 | |
349 local function isDisabled(core, module) | |
350 local moduleName | |
351 if type(module) == "table" then | |
352 moduleName = module.name | |
353 else | |
354 moduleName = module | |
355 end | |
356 local disabled | |
357 if type(module) == "table" and type(module.IsActive) == "function" then | |
358 return not module:IsActive() | |
359 elseif AceOO.inherits(core, "AceDB-2.0") then | |
360 local _,profile = core:GetProfile() | |
361 disabled = core.db and core.db.raw and core.db.raw.disabledModules and core.db.raw.disabledModules[profile] and core.db.raw.disabledModules[profile][moduleName] | |
362 else | |
363 disabled = core.disabledModules and core.disabledModules[moduleName] | |
364 end | |
365 if disabled == nil then | |
366 return defaultState[core][moduleName] | |
367 else | |
368 return disabled | |
369 end | |
370 end | |
371 | |
372 --[[---------------------------------------------------------------------------------- | |
373 Notes: | |
374 Sets the default active state of a module. This should be called before the ADDON_LOADED of the module. | |
375 Arguments: | |
376 string - name of the module. | |
377 table - reference to the module. | |
378 boolean - new state. false means disabled by default, true means enabled by default (true is the default). | |
379 Example: | |
380 self:SetModuleDefaultState('bank', false) | |
381 ------------------------------------------------------------------------------------]] | |
382 function AceModuleCore:SetModuleDefaultState(module, state) | |
383 AceModuleCore:argCheck(module, 2, "table", "string") | |
384 AceModuleCore:argCheck(state, 3, "boolean") | |
385 | |
386 if type(module) == "table" then | |
387 if not self:IsModule(module) then | |
388 AceModuleCore:error("%q is not a module", module) | |
389 end | |
390 module = module.name | |
391 end | |
392 | |
393 defaultState[self][module] = not state | |
394 end | |
395 | |
396 --[[---------------------------------------------------------------------------------- | |
397 Notes: | |
398 Toggles the active state of a module. | |
399 | |
400 This calls module:ToggleActive([state]) if available. | |
401 | |
402 If suspending, This will call :OnDisable() on the module if it is available. Also, it will iterate through the addon's mixins and call :OnEmbedDisable(module) if available. - this in turn will, through AceEvent and others, unregister events/hooks/etc. depending on the mixin. Also, it will call :OnModuleDisable(module) on the core if it is available. | |
403 | |
404 If resuming, This will call :OnEnable(first) on the module if it is available. Also, it will iterate through the addon's mixins and call :OnEmbedEnable(module) if available. - this in turn will, through AceEvent and others, unregister events/hooks/etc. depending on the mixin. Also, it will call :OnModuleEnable(module) on the core if it is available. | |
405 | |
406 If you call :ToggleModuleActive("name or module, true) and it is already active, it silently returns, same if you pass false and it is inactive. | |
407 | |
408 Arguments: | |
409 string/table - name of the module or a reference to the module | |
410 [optional] boolean - new state. (default not :IsModuleActive("name" or module)) | |
411 Returns: | |
412 * boolean - Whether the module is now in an active (enabled) state. | |
413 Example: | |
414 self:ToggleModuleActive('bank') | |
415 ------------------------------------------------------------------------------------]] | |
416 function AceModuleCore:ToggleModuleActive(module, state) | |
417 AceModuleCore:argCheck(module, 2, "table", "string") | |
418 AceModuleCore:argCheck(state, 3, "nil", "boolean") | |
419 | |
420 if type(module) == "string" then | |
421 if not self:HasModule(module) then | |
422 AceModuleCore:error("Cannot find module %q", module) | |
423 end | |
424 module = self:GetModule(module) | |
425 elseif not self:IsModule(module) then | |
426 AceModuleCore:error("%q is not a module", module) | |
427 end | |
428 | |
429 local disable | |
430 if state == nil then | |
431 disable = self:IsModuleActive(module) | |
432 else | |
433 disable = not state | |
434 if disable ~= self:IsModuleActive(module) then | |
435 return | |
436 end | |
437 end | |
438 | |
439 if type(module.ToggleActive) == "function" then | |
440 return module:ToggleActive(not disable) | |
441 elseif AceOO.inherits(self, "AceDB-2.0") then | |
442 if not self.db or not self.db.raw then | |
443 AceModuleCore:error("Cannot toggle a module until `RegisterDB' has been called and `ADDON_LOADED' has been fired.") | |
444 end | |
445 if type(self.db.raw.disabledModules) ~= "table" then | |
446 self.db.raw.disabledModules = {} | |
447 end | |
448 local _,profile = self:GetProfile() | |
449 if type(self.db.raw.disabledModules[profile]) ~= "table" then | |
450 self.db.raw.disabledModules[profile] = {} | |
451 end | |
452 if type(self.db.raw.disabledModules[profile][module.name]) ~= "table" then | |
453 local value = nil | |
454 if disable ~= defaultState[self][module.name] then | |
455 value = disable | |
456 end | |
457 self.db.raw.disabledModules[profile][module.name] = value | |
458 end | |
459 if not disable then | |
460 if not next(self.db.raw.disabledModules[profile]) then | |
461 self.db.raw.disabledModules[profile] = nil | |
462 end | |
463 if not next(self.db.raw.disabledModules) then | |
464 self.db.raw.disabledModules = nil | |
465 end | |
466 end | |
467 else | |
468 if type(self.disabledModules) ~= "table" then | |
469 self.disabledModules = {} | |
470 end | |
471 local value = nil | |
472 if disable ~= defaultState[self][module.name] then | |
473 value = disable | |
474 end | |
475 self.disabledModules[module.name] = value | |
476 end | |
477 if AceOO.inherits(module, "AceAddon-2.0") then | |
478 if not AceAddon.addonsStarted[module] then | |
479 return | |
480 end | |
481 end | |
482 if not disable then | |
483 local first = nil | |
484 if AceOO.inherits(module, "AceAddon-2.0") then | |
485 if AceAddon.addonsEnabled and not AceAddon.addonsEnabled[module] then | |
486 AceAddon.addonsEnabled[module] = true | |
487 first = true | |
488 end | |
489 end | |
490 local current = module.class | |
491 while true do | |
492 if current == AceOO.Class then | |
493 break | |
494 end | |
495 if current.mixins then | |
496 for mixin in pairs(current.mixins) do | |
497 if type(mixin.OnEmbedEnable) == "function" then | |
498 safecall(mixin.OnEmbedEnable, mixin, module, first) | |
499 end | |
500 end | |
501 end | |
502 current = current.super | |
503 end | |
504 if type(module.OnEnable) == "function" then | |
505 safecall(module.OnEnable, module, first) | |
506 end | |
507 if AceEvent then | |
508 AceEvent:TriggerEvent("Ace2_AddonEnabled", module, first) | |
509 end | |
510 else | |
511 local current = module.class | |
512 while true do | |
513 if current == AceOO.Class then | |
514 break | |
515 end | |
516 if current.mixins then | |
517 for mixin in pairs(current.mixins) do | |
518 if type(mixin.OnEmbedDisable) == "function" then | |
519 safecall(mixin.OnEmbedDisable, mixin, module) | |
520 end | |
521 end | |
522 end | |
523 current = current.super | |
524 end | |
525 if type(module.OnDisable) == "function" then | |
526 safecall(module.OnDisable, module) | |
527 end | |
528 if AceEvent then | |
529 AceEvent:TriggerEvent("Ace2_AddonDisabled", module) | |
530 end | |
531 end | |
532 return not disable | |
533 end | |
534 | |
535 --[[----------------------------------------------------------------------- | |
536 Notes: | |
537 Returns whether the module is in an active (enabled) state. This calls module:IsActive() if available. if notLoaded is set, then "name" must be a string. | |
538 Arguments: | |
539 string/table - name of the module or a reference to the module | |
540 [optional] - boolean - if set, this will check modules that are not loaded as well. (default: false) | |
541 Returns: | |
542 * boolean - Whether the module is in an active (enabled) state. | |
543 Example: | |
544 assert(self:IsModuleActive('bank')) | |
545 ------------------------------------------------------------------------]] | |
546 function AceModuleCore:IsModuleActive(module, notLoaded) | |
547 AceModuleCore:argCheck(module, 2, "table", "string") | |
548 AceModuleCore:argCheck(notLoaded, 3, "nil", "boolean") | |
549 if notLoaded then | |
550 AceModuleCore:argCheck(module, 2, "string") | |
551 end | |
552 | |
553 if AceModuleCore == self then | |
554 self:argCheck(module, 2, "table") | |
555 | |
556 local core = AceModuleCore.totalModules[module] | |
557 if not core then | |
558 self:error("Bad argument #2 to `IsModuleActive'. Not a module") | |
559 end | |
560 return core:IsModuleActive(module) | |
561 end | |
562 | |
563 if type(module) == "string" then | |
564 if not notLoaded and not self:HasModule(module) then | |
565 AceModuleCore:error("Cannot find module %q", module) | |
566 end | |
567 if not notLoaded then | |
568 module = self:GetModule(module) | |
569 else | |
570 module = self:HasModule(module) and self:GetModule(module) or module | |
571 end | |
572 else | |
573 if not self:IsModule(module) then | |
574 AceModuleCore:error("%q is not a module", module) | |
575 end | |
576 end | |
577 | |
578 return not isDisabled(self, module) | |
579 end | |
580 | |
581 -- #NODOC | |
582 function AceModuleCore:OnInstanceInit(target) | |
583 if target.modules then | |
584 do return end | |
585 AceModuleCore:error("OnInstanceInit cannot be called twice") | |
586 end | |
587 | |
588 if not AceAddon then | |
589 if AceLibrary:HasInstance("AceAddon-2.0") then | |
590 AceAddon = AceLibrary("AceAddon-2.0") | |
591 else | |
592 self:error(MAJOR_VERSION .. " requires AceAddon-2.0") | |
593 end | |
594 end | |
595 target.modules = {} | |
596 | |
597 target.moduleClass = AceOO.Class("AceAddon-2.0") | |
598 target.modulePrototype = target.moduleClass.prototype | |
599 end | |
600 | |
601 AceModuleCore.OnManualEmbed = AceModuleCore.OnInstanceInit | |
602 | |
603 function AceModuleCore.OnEmbedProfileDisable(AceModuleCore, self, newProfile) | |
604 if not AceOO.inherits(self, "AceDB-2.0") then | |
605 return | |
606 end | |
607 local _,currentProfile = self:GetProfile() | |
608 for k, module in pairs(self.modules) do | |
609 if type(module.IsActive) == "function" or type(module.ToggleActive) == "function" then | |
610 -- continue | |
611 else | |
612 local currentActive = not self.db or not self.db.raw or not self.db.raw.disabledModules or not self.db.raw.disabledModules[currentProfile] or not self.db.raw.disabledModules[currentProfile][module.name] | |
613 local newActive = not self.db or not self.db.raw or not self.db.raw.disabledModules or not self.db.raw.disabledModules[newProfile] or not self.db.raw.disabledModules[newProfile][module.name] | |
614 if currentActive ~= newActive then | |
615 self:ToggleModuleActive(module) | |
616 if not self.db.raw.disabledModules then | |
617 self.db.raw.disabledModules = {} | |
618 end | |
619 if not self.db.raw.disabledModules[currentProfile] then | |
620 self.db.raw.disabledModules[currentProfile] = {} | |
621 end | |
622 self.db.raw.disabledModules[currentProfile][module.name] = not currentActive or nil | |
623 end | |
624 end | |
625 end | |
626 end | |
627 | |
628 -- #NODOC | |
629 function AceModuleCore:Ace2_AddonEnabled(module, first) | |
630 local addon = self.totalModules[module] | |
631 if not addon then | |
632 return | |
633 end | |
634 | |
635 if modulesWithMethod[addon] then | |
636 for k,v in pairs(modulesWithMethod[addon]) do | |
637 modulesWithMethod[addon] = del(v) | |
638 end | |
639 end | |
640 if type(addon.OnModuleEnable) == "function" then | |
641 safecall(addon.OnModuleEnable, addon, module, first) | |
642 end | |
643 end | |
644 | |
645 -- #NODOC | |
646 function AceModuleCore:Ace2_AddonDisabled(module) | |
647 local addon = self.totalModules[module] | |
648 if not addon then | |
649 return | |
650 end | |
651 | |
652 if modulesWithMethod[addon] then | |
653 for k,v in pairs(modulesWithMethod[addon]) do | |
654 modulesWithMethod[addon] = del(v) | |
655 end | |
656 end | |
657 if type(addon.OnModuleDisable) == "function" then | |
658 safecall(addon.OnModuleDisable, addon, module) | |
659 end | |
660 end | |
661 | |
662 local function activate(self, oldLib, oldDeactivate) | |
663 AceModuleCore = self | |
664 | |
665 self.totalModules = oldLib and oldLib.totalModules or {} | |
666 | |
667 self:activate(oldLib, oldDeactivate) | |
668 | |
669 if oldDeactivate then | |
670 oldDeactivate(oldLib) | |
671 end | |
672 end | |
673 | |
674 local function external(self, major, instance) | |
675 if major == "AceEvent-2.0" then | |
676 AceEvent = instance | |
677 AceEvent:embed(self) | |
678 | |
679 self:UnregisterAllEvents() | |
680 self:RegisterEvent("Ace2_AddonEnabled") | |
681 self:RegisterEvent("Ace2_AddonDisabled") | |
682 elseif major == "AceAddon-2.0" then | |
683 AceAddon = instance | |
684 end | |
685 end | |
686 | |
687 AceLibrary:Register(AceModuleCore, MAJOR_VERSION, MINOR_VERSION, activate, nil, external) | |
688 AceModuleCore = AceLibrary(MAJOR_VERSION) |