Refactored into cleaner classes, player now uses pub/sub