LibStub is a minimalistic versioning library that allows other libraries to easily register themselves and upgrade. It is meant to be a cross-community library sharing system.
LibStub is hereby placed in the Public Domain
Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel, joshborke
The table instance of a registered library or nil if not found and the minor version of the library as the second return value.
An iterator over the registered major libraries.
The table to be used by the library as well as the minor version of the previously registered library, if any.
or
local lib = LibStub:NewLibrary("MyLibrary-1.0", 1)
if not lib then
return -- already loaded and no upgrade necessary
end
lib.somearray = lib.somearray or {}
if not lib.frame then
lib.frame=CreateFrame("Frame")
end
function lib:SomeFunction()
-- do stuff here
end
function lib:SomeOtherFunction()
-- do other stuff here
end
local function OnUpdate()
-- timing stuff here
end
lib.frame:SetScript("OnUpdate", OnUpdate);
local lib = LibStub:NewLibrary("MyLibrary-1.0", "$Revision: 12345$")
Do be aware that moving a library from one repository to another will change revision numbers. Do not ever let it slide backwards. If you are caught in this situation, you might want to use something like:
local lib = LibStub:NewLibrary("MyLibrary-1.0",
12345+tonumber(strmatch("%d+","$Revision: 2$"))
)
This is a convention rather than a function of the specification, but all Ace3 and Rock related libraries use the following semantics for doing embedding / mixing in (specifically, libraries with an .Embed() member can be specified as embeds during addon object creation rather than having to embed them explicitly):
lib.mixinTargets = lib.mixinTargets or {}
local mixins = {"SomeFunction", "SomeOtherFunction" }
function lib:Embed(target)
for _,name in pairs(mixins) do
target[name] = lib[name]
end
lib.mixinTargets[target] = true
end
... and at the end of the file, we handle library upgrades by simply re-embedding the library in all positions where it has previously been embedded / mixed in:
for target,_ in pairs(mixinTargets) do lib:Embed(target) end
© 2008-2009 Curse Inc.