code: public Object getItem(ELContext context, int i) {
          if (originalListObject == null) {
              originalListObject = orig.getValue(context);
              if (originalListObject instanceof Collection) {
                  type = TypesEnum.ACollection;
              } else if (originalListObject instanceof Iterator) {
                  type = TypesEnum.AnIterator;
              } else if (originalListObject instanceof Enumeration) {
                  type = TypesEnum.AnEnumeration;
              } else if (originalListObject instanceof Map) {
                  type = TypesEnum.AMap;
              } else if (originalListObject instanceof String) { //StringTokens
                  type = TypesEnum.AString;
              } else {
                  //it's of some other type ... should never get here
                  throw new RuntimeException("IteratedExpression.getItem: Object not of correct type.");
              }
              currentListObject = returnNewIterator(originalListObject, type);
          }
          Object currentObject = null;
          if (i < currentIndex) {
              currentListObject = returnNewIterator(originalListObject, type);
              currentIndex = 0;
          }
          for (; currentIndex <= i; currentIndex++) {
              if (currentListObject.hasNext()) {
                  currentObject = currentListObject.next();
              } else {
                  throw new RuntimeException("IteratedExpression.getItem: Index out of Bounds");
              }
          }
          return currentObject;
      }
docs: Iterates the original expression and returns the value at the index.
  
  @param context against which the expression should be evaluated
  @param i       the index of the value to return
  @return the value at the index