make read() much shorter, spliting functionality over sub methods