@Override
    public List<String> generate(final String aValue) {
        final List<String> result = new ArrayList<String>();
        if (aValue == null || aValue.isEmpty()) {
            return result;
        }
        if (aValue.length() == 1) {
            result.add(aValue);
            return result;
        }

        if (aValue.length() == 2) {
            result.add(aValue);
            for (int i = aValue.length() - 1; i >= 0; i--) {
                for (int j = 0; j < i; j++) {
                    result.add(swapChars(aValue, i, j));
                }
            }
        } else {
            for (int i = 0; i < aValue.length(); i++) {
                final String value = skipPosition(aValue, i);
                for (final String possibleValues : generate(value)) {
                    result.add("" + aValue.charAt(i) + possibleValues);
                }
            }
        }
        return result;
    }