IMO, loop should delegate all its behavior to another method (`tick`).
It make testing easy, because calling `tick` is always enough.