messed with generics and other fun things