abstract type definition and lookup to allow for the mechanics to be changed