return instancetype instead