again maybe abstract some of this into "private" methods (ones that start with an underscore)