anchor.diff:  //creates every subtype of prototype (excluding prototype) and adds it to list L.
   //if no list/L is provided, one is created.
   /proc/init_subtypes(prototype, list/L)
  -        if(!istype(L))        L = list()
  -        for(var/path in typesof(prototype))
  -                if(path == prototype)        continue
  -                L += new path()
  -        return L
  +	if(!istype(L))	L = list()
  +	for(var/path in subtypesof(prototype))
  +		L += new path()
  +	return L
  +
  +/proc/init_datum_subtypes(prototype, list/L, list/pexempt, assocvar)
  +	if(!istype(L))	L = list()
  +	for(var/path in subtypesof(prototype) - pexempt)
  +		var/datum/D = new path()
  +		if(istype(D))
  +			var/assoc
  +			if(D.vars["[assocvar]"]) //has the var
  +				assoc = D.vars["[assocvar]"] //access value of var
  +			if(assoc) //value gotten
  +				L["[assoc]"] = D //put in association
  +	return L
positive.code: 			language_keys[".[lowertext(L.key)]"] = L
  			language_keys["#[lowertext(L.key)]"] = L
  
  	var/rkey = 0
  	paths = subtypesof(/datum/species)
  	for(var/T in paths)
  		rkey++
  		var/datum/species/S = new T
  		S.race_key = rkey //Used in mob icon caching.
  		all_species[S.name] = S
  
  		if(S.flags & IS_WHITELISTED)
  			whitelisted_species += S.name
  
  	init_subtypes(/datum/table_recipe, table_recipes)
  
  	return 1
  
  /* // Uncomment to debug chemical reaction list.
  
negative.code: 	//socks
  	init_sprite_accessory_subtypes(/datum/sprite_accessory/socks, socks_list, socks_m, socks_f)
  
  	init_subtypes(/datum/surgery_step, surgery_steps)
  	sort_surgeries()
  
  	init_datum_subtypes(/datum/job, joblist, list(/datum/job/ai, /datum/job/cyborg), "title")
  	init_datum_subtypes(/datum/superheroes, all_superheroes, null, "name")
  	init_datum_subtypes(/datum/language, all_languages, null, "name")
  
  	for (var/language_name in all_languages)
  		var/datum/language/L = all_languages[language_name]
  