abstract class Shuffler<T> implements IShuffle<T> { private SeqValidator<T> validator = new SeqValidator<T>(); // IShuffle methods public T[] shuffle(T[] seq) throws IllegalArgumentException { validator.assertSeqNotEmpty(seq); maneuver(seq, 0, seq.length - 1); return seq; } public T[] shuffle(T[] seq, int from, int to) throws IndexOutOfBoundsException, IllegalArgumentException { validator.assertValidRange(seq, from, to); maneuver(seq, from, to); return seq; } // Abstract methods public abstract void maneuver(T[] seq, int from, int to); }