-- LibStub is a simple versioning stub meant for use in Libraries.  http://www.wowace.com/wiki/LibStub for more info
-- LibStub is hereby placed in the Public Domain Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel, joshborke
local LIBSTUB_MAJOR, LIBSTUB_MINOR = "LibStub", 2 -- NEVER MAKE THIS AN SVN REVISION! IT NEEDS TO BE USABLE IN ALL REPOS!
local _G = getfenv()
local strfind, strfmt = string.find, string.format
local LibStub = _G[ LIBSTUB_MAJOR ]

if not LibStub or LibStub.minor < LIBSTUB_MINOR then
  LibStub = LibStub or { libs = {}, minors = {} }
  _G[ LIBSTUB_MAJOR ] = LibStub
  LibStub.minor = LIBSTUB_MINOR

  function LibStub:NewLibrary( major, minor )
    assert( type( major ) == "string", "Bad argument #2 to `NewLibrary' (string expected)" )
    local _, _, num = strfind( minor, "(%d+)" )
    minor = assert( tonumber( num ), "Minor version must either be a number or contain a number." )

    local oldminor = self.minors[ major ]
    if oldminor and oldminor >= minor then return nil end
    self.minors[ major ], self.libs[ major ] = minor, self.libs[ major ] or {}
    return self.libs[ major ], oldminor
  end

  function LibStub:GetLibrary( major, silent )
    if not self.libs[ major ] and not silent then
      error( strfmt( "Cannot find a library instance of %q.", tostring( major ) ), 2 )
    end
    return self.libs[ major ], self.minors[ major ]
  end

  function LibStub:IterateLibraries() return pairs( self.libs ) end

  setmetatable( LibStub, { __call = LibStub.GetLibrary } )
end
