package au.com.seek.domain; public enum Direction { NORTH { @Override public Direction turnRight() { return EAST; } @Override public Direction turnLeft() { return WEST; } @Override public int stepValueOnXAxis() { return 0; } @Override public int stepValueOnYAxis() { return STEP_VALUE; } }, EAST { @Override public Direction turnRight() { return SOUTH; } @Override public Direction turnLeft() { return NORTH; } @Override public int stepValueOnXAxis() { return STEP_VALUE; } @Override public int stepValueOnYAxis() { return 0; } }, SOUTH { @Override public Direction turnRight() { return WEST; } @Override public Direction turnLeft() { return EAST; } @Override public int stepValueOnXAxis() { return 0; } @Override public int stepValueOnYAxis() { return NEGATIVE_STEP_VALUE; } }, WEST { @Override public Direction turnRight() { return NORTH; } @Override public Direction turnLeft() { return SOUTH; } @Override public int stepValueOnXAxis() { return NEGATIVE_STEP_VALUE; } @Override public int stepValueOnYAxis() { return 0; } }; private static final int NEGATIVE_STEP_VALUE = -1; private static final int STEP_VALUE = 1; public abstract Direction turnRight(); public abstract Direction turnLeft(); public abstract int stepValueOnXAxis(); public abstract int stepValueOnYAxis(); }