abstract defs first, be more general