abstract macro