docs: def elapsed(self):
          """ Return the current elapsed time since start
          If the `elapsed` property is called in the context manager scope,
          the elapsed time bewteen start and property access is returned.
          However, if it is accessed outside of the context manager scope,
          it returns the elapsed time bewteen entering and exiting the scope.
          The `elapsed` property can thus be accessed at different points within
          the context manager scope, to time different parts of the block.
          """
          if self.end is None:
              # if elapsed is called in the context manager scope
              return (self() - self.start) * self.factor
          else:
              # if elapsed is called out of the context manager scope
              return (self.end - self.start) * self.factor