pushing device specific functionality into subclasses.