it looks nicer now, but at the expense of more files and code