abstracted types to keep implementations hidden