updated with returning self