do
	local path = minetest.get_modpath('sorcery');
	local get = function(unit)
		return dofile(path .. '/' .. unit .. '.lua')
	end
	sorcery = {
		path = path;
		load = function(name) get(name) end;
		unit = function(ns,sfx)
			local target
			if ns then
				sorcery[ns] = {}
				target = sorcery[ns]
			else target = sorcery end
			return function(lst)
				for i=1,#lst do
					target[lst[i]] = get(((ns and ns..'/') or '')..lst[i])
				end
			end
		end;
	}
end

-- unfortunately we can't just iterate over the files
-- and load them automatically, as interdependencies
-- exist (especially with /lib) and we need to be very
-- careful about the order they're loaded in

sorcery.unit('data') {'ui'}
sorcery.unit('lib') {
	-- convenience
	'str';
	-- serialization
	'marshal', 'json';
	-- data structures
	'tbl', 'class';
	-- wrappers
	'color', 'image', 'ui';
}

sorcery.unit() { 'compat', 'matreg' }
sorcery.unit('data') {
	'affinities'; 'gods';
	'enchants', 'spells';
	'gems', 'metals';
	'potions', 'oils', 'greases',
		'draughts', 'elixirs',
		'philters', 'extracts';
	'register';
}

for _,u in pairs {
	'leylines'; 'ores'; 'gems';
	'potions'; 'infuser'; 'altar'; 'wands';
	'tools'; 'enchanter'; 'harvester';
	'smelter'; 'entities'; 'recipes'; 'coins';
	'interop';
} do sorcery.load(u) end
