anchor.diff:  	START_PROCESSING(SSobj, src)
   
   /**
  - * # generate
  - *
    * Proc called every 2 seconds from SSMobs to add whatever reagent the udder is generating.
    */
   /obj/item/udder/proc/generate()
  
positive.code: 		//usually this would be a callback but this is a specifically gutlunch feature so fuck it, gutlunch specific proccall
  		gutlunch.regenerate_icons(reagents.total_volume, reagents.maximum_volume)
  
  ///signal called on parent attacking an atom
  /obj/item/udder/proc/on_mob_attacking(mob/living/simple_animal/hostile/gutlunch, atom/target)
  	SIGNAL_HANDLER
  
  	if(is_type_in_typecache(target, gutlunch.wanted_objects)) //we eats
  		generate()
  		gutlunch.visible_message(span_notice("[src] slurps up [target]."))
  		qdel(target)
  	return COMPONENT_HOSTILE_NO_ATTACK //there is no longer a target to attack
  
  
negative.code: 			on_generate_callback.Invoke(reagents.total_volume, reagents.maximum_volume)
  
  /**
   * Proc called from attacking the component parent with the correct item, moves reagents into the glass basically.
   *
   * Arguments:
   * * obj/item/reagent_containers/glass/milk_holder - what we are trying to transfer the reagents to
   * * mob/user - who is trying to do this
   */
  /obj/item/udder/proc/milk(obj/item/reagent_containers/glass/milk_holder, mob/user)
  	if(milk_holder.reagents.total_volume >= milk_holder.volume)
  