anchor.diff:  	RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, PROC_REF(customizable_attack))
   	RegisterSignal(parent, COMSIG_PARENT_EXAMINE, PROC_REF(on_examine))
   	RegisterSignal(parent, COMSIG_ATOM_PROCESSED, PROC_REF(on_processed))
  +	RegisterSignal(parent, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM, PROC_REF(on_requesting_context_from_item))
   	ADD_TRAIT(parent, TRAIT_CUSTOMIZABLE_REAGENT_HOLDER, REF(src))
   
   
  
positive.code: 	for (var/r in results)
  		var/atom/result = r
  		result.AddComponent(/datum/component/customizable_reagent_holder, null, fill_type, ingredient_type = ingredient_type, max_ingredients = max_ingredients, initial_ingredients = ingredients)
  
negative.code: 	var/mutable_appearance/top_overlay
  	///Type of ingredients to accept, [CUSTOM_INGREDIENT_TYPE_EDIBLE] for example.
  	var/ingredient_type
  	/// Adds screentips for all items that call on this proc, defaults to "Add"
  	var/screentip_verb
  
  /datum/component/customizable_reagent_holder/Initialize(
  		atom/replacement,
  		fill_type,
  		ingredient_type = CUSTOM_INGREDIENT_TYPE_EDIBLE,
  		max_ingredients = MAX_ATOM_OVERLAYS - 3, // The cap is >= MAX_ATOM_OVERLAYS so we reserve 2 for top /bottom of item + 1 to stay under cap
  		list/obj/item/initial_ingredients = null,
  		screentip_verb = "Add",
  )
  	if(!isatom(parent))
  		return COMPONENT_INCOMPATIBLE
  	var/atom/atom_parent = parent
  	// assume replacement is OK
  	if (!atom_parent.reagents && !replacement)
  		return COMPONENT_INCOMPATIBLE
  
  	atom_parent.flags_1 |= HAS_CONTEXTUAL_SCREENTIPS_1
  
  	src.replacement = replacement
  	src.fill_type = fill_type
  	src.max_ingredients = max_ingredients
  	src.ingredient_type = ingredient_type
  	src.screentip_verb = screentip_verb
  
  	if (initial_ingredients)
  		for (var/_ingredient in initial_ingredients)
  