decouples report generation from timer ownership