not sure if we need an interface for this but I guess it doesn't hurt either. I wonder if we can make it an abstract class and overload shuffle to only take a list?