Mercurial > wow > dependencyloader
diff DependencyLoader_Core/Addon.lua @ 8:930871e163bc
created a new Tree class and started rearranging code
author | mckenziemc |
---|---|
date | Sat, 04 Dec 2010 23:05:34 -0800 |
parents | 9852fcd5e59e |
children |
line wrap: on
line diff
--- a/DependencyLoader_Core/Addon.lua Sat Dec 04 14:45:36 2010 -0800 +++ b/DependencyLoader_Core/Addon.lua Sat Dec 04 23:05:34 2010 -0800 @@ -4,7 +4,6 @@ local addonName, addonTable = ... -print("running Addon.lua") -- NOTE: I assume that the API addon functions are -- slightly quicker with an index than with a number. @@ -13,11 +12,25 @@ local Addon, addon = addonTable:NewClass("Addon") + +-- load ability masks +Addon.loadMasks = { + reload = bit.lshift(1, 0), -- can load after reloadui + ondemand = bit.lshift(1, 1), -- can load on demand + forceafter = bit.lshift(1, 2), -- force load after it would normally be loaded + forcebefore = bit.lshift(1, 3), -- force load before it would normally be loaded +} + + +Addon.addons = {} +Addon.nameToIndex = {} + + +-- Internal function +-- Creates a new Addon object +-- @param id Name or index of the addon. function Addon:New(id) - assert(type(id) == "number" or type(id) == "string") - local instance = {} - setmetatable(instance, self.instanceMetatable) if type(id) == "number" then @@ -47,6 +60,37 @@ end +--- Retrieves an Addon object. +-- @param id Name or index of the addon to retrieve. +-- @return The Addon object, or nil if not found. +function Addon:Get(id) + if not self:Exists(id) then + return nil + end + + if type(id) == "number" then + if self.addons[id] ~= nil then + return self.addons[id] + end + + local new = self:New(id) + self.addons[new:GetIndex()] = new + self.nameToIndex[new:GetName()] = id + + return new + elseif type(id) == "string" then + if self.nameToIndex[id] then + return self.addons[self.nameToIndex[id] ] + end + + local new = self:New(id) + self.addons[new:GetIndex()] = new + self.nameToIndex[id] = new:GetIndex() + + return new + end +end + -- Checks if an addon exists with the specified name. -- @param addon Name of the addon. -- @return True if the addon is present, false otherwise. @@ -71,6 +115,11 @@ end +function Addon:GetLoadMasks() + return self.masks +end + + function addon:GetName() return self.name end @@ -92,13 +141,39 @@ end end --- FIXME: an addon may be present but unloadable if loading out of date addons is disabled. --- NOTE: CanForceLoad and CanLoD don't check the status of dependencies -function addon:CanForceLoad() - return true -- TODO: check if there's any reason addons can't be forceloaded +function addon:GetLoadBitfield() + local bitfield = 0 + + if self:CanLoad() then + bitfield = bitfield + self.masks.reload + end + + if self:CanLoD() then + bitfield = bitfield + self.masks.ondemand + end + + if self:CanForceLoadAfter() then + bitfield = bitfield + self.masks.forceafter + end + + if self:CanForceLoadBefore() then + bitfield = bitfield + self.masks.forcebefore + end + + return bitfield end + +--- Checks if the addon is loadable. +-- Considers interface issues, missing, etc. (NYI) +-- Does not check dependencies. +function addon:CanLoad() + -- FIXME: an addon may be present but unloadable if loading out of date addons is disabled. + return true +end + + function addon:CanLoD() -- FIXME: what will the client say about addons using LoadManagers if the LM was force-loaded? if IsAddOnLoadOnDemand(self.name) then @@ -108,6 +183,25 @@ end end + +function addon:CanForceLoadAfter() + -- TODO: check Errata module + return false +end + + +function addon:CanForceLoadBefore() + -- TODO: check Errata module + return false -- TODO: check if there's any reason addons can't be forceloaded +end + + +function addon:Enable() + -- FIXME: delay this till after PLAYER_LOGIN or it'll get force-loaded + EnableAddOn(self.name) +end + + -- NOTE: only call for LoD, not force-loading function addon:Load() assert(self:CanLoD()) @@ -116,6 +210,7 @@ LoadAddOn(self.name) end + function addon:ForceLoad() assert(self:CanForceLoad()) -- TODO: make sure force-loading is available at this time @@ -125,6 +220,7 @@ function addon:GetDependencies() + -- TODO: consider no-lib embeds as deps? return GetAddOnDependencies(self.index) end