return cls so it can be used as a decorator