diff DependencyLoader/Tree.lua @ 10:e0a4a8b5b389

lots more modifications...
author mckenziemc
date Sun, 05 Dec 2010 03:10:07 -0800
parents 5362e308c3eb
children b230b94d4487
line wrap: on
line diff
--- a/DependencyLoader/Tree.lua	Sun Dec 05 00:12:57 2010 -0800
+++ b/DependencyLoader/Tree.lua	Sun Dec 05 03:10:07 2010 -0800
@@ -6,7 +6,7 @@
 local addonName, addonTable = ...
 
 
---	TODO: prevent infinite loops in the recursive functions
+--	FIXME: prevent infinite loops in the recursive functions
 
 
 local Tree, tree = addonTable:NewClass("Tree")
@@ -14,6 +14,7 @@
 
 Tree.trees = {}
 
+
 --	internal
 --	Creates a new tree object
 --	@param	root	Name, index, or Addon object of the root addon.
@@ -68,48 +69,54 @@
 end
 
 
---	Checks if the tree rooted at the specified addon can be force-loaded.
---	@param	root	The name or index of the root addon.
-function core:CanForceLoadTree(root)
-	--	TODO: if some addons have already loaded, we have to check 
-	--	forceafter for those and forcebefore for the others
-	return false
+---	Checks if this tree can be force-loaded.
+--	Does not check user settings nor if force-loading is actually available.
+--	@return	canForceLoad	True if this tree can be force loaded, false otherwise
+function tree:CanForceLoad()
+	if self.root:IsLoaded() then
+		return true
+	end
+	
+	if not self.root:CanForceLoad() then
+		return false
+	end
+	
+	--	now check dependencies recursively
+	local dependencies = {self.root:GetDependencies()}
+	for i, depName in pairs(dependencies) do
+		local depTree = Tree:Get(depName)
+		
+		if not depTree:CanForceLoad() then
+			return false
+		end
+	end
+	
+	return
 end
 
 
 --	NOTE: any tree that can be loaded on demand is also eligible for force-loading
---	Checks if the tree rooted at the specified addon can be loaded on demand.
---	@param	root	The name or index of the root addon.
-function core:CanLoDTree(root)
-	local bitfield = self:GetLoadBitfield()
-	root = self:GetAddon(root)
-	assert(root)
-
+--	Checks if the tree can be loaded on demand.
+function tree:CanLoD()
 	--	since this will be used recursively, return true if 
 	--	this is already loaded.
-	if root:IsLoaded() then
+	if self.root:IsLoaded() then
 		return true
 	end
 	
 	--	true if all dependencies are loaded or LoD
 	
-	if not root:CanLoD() then
+	if not self.root:CanLoD() then
 		return false
 	end
 	
 	--	now check dependencies recursively
 	local dependencies = {root:GetDependencies()}
 	for i, depName in pairs(dependencies) do
-		local dep = self:GetAddon(depName)
+		local depTree = Tree:Get(depName)
 		
-		if not dep then
-			return false		--	missing
-		end
-		
-		if not dep:IsLoaded() then
-			if not self:CanLoDTree(depName) then
-				return false
-			end
+		if not depTree:CanLoD() then
+			return false
 		end
 	end
 	
@@ -121,12 +128,8 @@
 --	can be loaded if all dependencies are enabled 
 --	the UI is reloaded.
 --	Basically makes sure all dependencies are installed.
-function core:CanReloadTree(root)
-	--	convert root to an Addon object
-	root = self:GetAddon(root)
-	assert(root)
-	
-	if root:IsLoaded() then
+function tree:CanLoad()
+	if self.root:IsLoaded() then
 		return true
 		--	FIXME: 	deps may have been disabled
 	end
@@ -136,11 +139,11 @@
 	--	now check dependencies recursively
 	--	FIXME: prevent infinite recursion
 
-	local dependencies = {root:GetDependencies()}
+	local dependencies = {self.root:GetDependencies()}
 	for i, depName in pairs(dependencies) do
-		local dep = self:GetAddon(depName)
+		local depTree = Tree:Get(depName)
 		
-		if dep == nil then
+		if not depTree:CanLoad() then
 			return false		--	missing dependency
 		end
 
@@ -150,10 +153,11 @@
 	return true
 end
 
+--[[
 --	Loads the tree rooted at the specified addon.
 --	FIXME: load the root too or not?
 --	Supports both LoD addons and those that require force-loading.
-function core:LoadTree(addon)
+function tree:Load(addon)
 	--	don't check if the tree can actually be loaded.
 	--	external code should do that itself to check if it 
 	--	should even call this at all.
@@ -165,31 +169,30 @@
 		self:LoadLoDTree(addon)
 	end
 end
+]]
 
 
 --	load the root too, since it may actually be a leaf
-function core:ForceLoadTree(root)
-	root = self:GetAddon(root)
-	assert(root)
-	
+function tree:ForceLoad()
 	--	load dependencies
-	local dependencies = {root:GetDependencies(addon)}
+	local dependencies = {self.root:GetDependencies()}
 	for i, depName in pairs(dependencies) do
-		self:ForceLoadTree(depName)
+		local depTree = Tree:Get(depName)
+		depTree:ForceLoad()
 	end
 
 	--	load embeds, if they are available separately
-	local embeds = {root:GetEmbeds(addon)}
+	local embeds = {self.root:GetEmbeds()}
 	for i, embedName in pairs(embeds) do
-		if Addon:Exists(embedName) then
-			self:ForceLoadTree(embedName)
-		end
+		local embedTree = Tree:Get(embedName)
+		embedTree:ForceLoad()
 	end
 	
 	root:ForceLoad()
 end
 
 
+--[[	don't think i need this
 function core:LoadLoDTree(root)
 	root = self:GetAddon(root)
 	assert(root)
@@ -210,24 +213,22 @@
 	
 	root:LoD()
 end
+]]
 
 
 --	I think the problem this solves is a major issue with 
 --	migrating to separate libs. think about it more and document 
 --	here and in project description
-function core:PrepareLoDTree(root)
-	root = self:GetAddon(root)
-	assert(root)
-	
+function tree:PrepareForLoD()
 	--	assume root is LoD
 	
 	--	check dependencies
 	local dependencies = {root:GetDependencies(addon)}
 	for i, depName in pairs(dependencies) do
-		local dep = self:GetAddon(depName)
+		local depTree = Tree:Get(depName)
+		depTree:PrepareForLoD()
 		
-		--	assume external code made sure it exists
-		
+		--[[
 		if dep:CanLoD() then
 			--	don't load it now but make sure its dependencies are prepared
 			self:PrepareLoDTree(depName)
@@ -236,13 +237,16 @@
 			--	force-load it now so we can load the parent on demand
 			self:ForceLoadTree(depName)
 		end
+		]]
 	end
 
 	--	prepare embeds, if they are available separately
 	local embeds = {root:GetEmbeds(addon)}	--	FIXME: addon?
 	for i, embedName in pairs(embeds) do
-		local embed = self:GetAddon(embedName)
+		local embedTree = Tree:Get(embedName)
+		embedTree:PrepareForLoD()
 		
+		--[[
 		if embed then
 			if embed:CanLoD() then
 				--	don't load it now but make sure its dependencies are prepared
@@ -253,35 +257,23 @@
 				self:ForceLoadTree(depName)
 			end
 		end
+		]]
 	end
 end
 
 
-function Core:PrepareReloadTree(addon)
-	root = self:GetAddon(root)
-	assert(root)
-	
-	root:Enable()
+function tree:PrepareForReload()
+	self.root:Enable()
 	
 	--	check dependencies
-	local dependencies = {root:GetDependencies()}
+	local dependencies = {self.root:GetDependencies()}
 	for i, depName in pairs(dependencies) do
-		self:PrepareReloadTree(depName)
+		Tree:Get(depName):PrepareForReload()
 	end
 
 	--	prepare embeds, if they are available separately
-	local embeds = {root:GetEmbeds(addon)}
+	local embeds = {self.root:GetEmbeds(addon)}
 	for i, embedName in pairs(embeds) do
-		local embed = self:GetAddon(embedName)
-		
-		if embed then
-			self:PrepareReloadTree(embedName)
-		end
+		Tree:Get(embedName):PrepareForReload()
 	end
 end
-
-
-function Core:ForceLoadAvailable()
-	return true
-	--	FIXME: use field and a frame registered for PLAYER_LOGIN
-end