public List<String> generate(final String aValue) {
        if (aValue == null || aValue.isEmpty()) {
            return Collections.emptyList();
        }
        final Queue<String> queue = new LinkedList<String>();
        final Queue<String> charsToParse = getCharsToParse(aValue);
        queue.offer(charsToParse.poll());
        int currentStep = 0;
        while (!charsToParse.isEmpty()) {
            currentStep++;
            enqueueNextLevel(queue, charsToParse.poll(), factorial.calculate(currentStep));
        }
        return new ArrayList<String>(queue);
    }