private void processEachToken(TemplateEachToken eachToken) {
		// here's where it really gets fun
		// find array represented by the each block
		Object arrayValue = context.get(eachToken.getArrayName());
		// prep to go through each token content
		ArrayList<ITemplateItem> eachContent = eachToken.getContent();
		int contentlen = eachContent.size();
		ITemplateItem currentItem;
		StringBuilder markup = new StringBuilder();
		Boolean isProcessed = false;
		// process the value
		if (arrayValue != null && arrayValue.getClass() == ArrayList.class) {
			// if given value is an array
			this.context.add(eachToken.getInstanceName());
			@SuppressWarnings("unchecked")
			ArrayList<Object> list = (ArrayList<Object>) arrayValue;
			int listlen = list.size();
			Object listItem;
			for (int i=0; i<listlen; i++) {
				// put line item into context
				listItem = list.get(i);
				this.context.put(eachToken.getInstanceName(), listItem);
				// loop through each token's content
				for (int n=0; n<contentlen; n++) {
					currentItem = eachContent.get(n);
					this.processTemplateItem(currentItem);
					// add to markup
					currentItem.appendTo(markup);
				}
			}
			isProcessed = true;
		} else if (arrayValue != null && arrayValue.getClass() == LinkedHashMap.class) {
			// if given value is a json object
			this.context.add(eachToken.getInstanceName());
			@SuppressWarnings("unchecked")
			LinkedHashMap<String, Object> map = (LinkedHashMap<String, Object>) arrayValue;
			Iterator<String> keys = map.keySet().iterator();
			String key;
			Object mapValue;
			while (keys.hasNext()) {
				key = keys.next();
				mapValue = map.get(key);
				this.context.put(eachToken.getInstanceName(), mapValue);
				for (int a=0; a<contentlen; a++) {
					currentItem = eachContent.get(a);
					this.processTemplateItem(currentItem);
					// add to markup
					currentItem.appendTo(markup);
				}
			}
			isProcessed = true;
		}
		// finally, set token's markup
		if (isProcessed) {
			eachToken.setMarkup(markup.toString());
		}
	}