use instancetype for more subclassing flexibility