code: @Override
  	protected Object doExec(Element element, Object scope, String propertyPath, Object... arguments) throws IOException, TemplateException {
  		if (!propertyPath.equals(".") && ConverterRegistry.hasType(scope.getClass())) {
  			throw new TemplateException("Operand is property path but scope is not an object.");
  		}
  		Element itemTemplate = element.getFirstChild();
  		if (itemTemplate == null) {
  			throw new TemplateException("Invalid list element |%s|. Missing item template.", element);
  		}
  		Stack<Index> indexes = serializer.getIndexes();
  		Index index = new Index();
  		indexes.push(index);
  		for (Object item : content.getIterable(scope, propertyPath)) {
  			index.increment();
  			serializer.writeItem(itemTemplate, item);
  		}
  		indexes.pop();
  		return null;
  	}
docs: Execute OLIST operator. Behaves like {@link ListOperator#doExec(Element, Object, String, Object...)} counterpart but
  takes care to create index and increment it before every item processing.
  
  @param element context element,
  @param scope scope object,
  @param propertyPath property path,
  @param arguments optional arguments, not used.
  @return always returns null to signal full processing.
  @throws IOException if underlying writer fails to write.
  @throws TemplateException if element has no children or content list is undefined.