public void iterate(String text, int start, Collection<String> list, Position position) {
        int stop = parts.size();
        if (start == stop) {
            if (parent == null) {
                list.add(text);
            } else {
                parent.iterate(text, position.value, list, position.parent);
            }
            return;
        }

        Object value = parts.get(start);
        if (value instanceof String) {
            iterate(text + value, start + 1, list, position);
        } else if (value instanceof PartCombinator) {
            iterate(text, start + 1, list, position);

            PartCombinator part = (PartCombinator) value;
            part.iterate(text, 0, list, new Position(position, start + 1));
        } else {
            iterate(text, start + 1, list, position);
        }
    }