abstract types