abstracted out ability