private static Pair<Boolean,List<String>> shouldFollowField(int nestingLevel, int MAX_NESTING, Object o, Field field) {
		boolean shouldFollow = true;
		List<String> reasons = new ArrayList<String>();
		
    	if (Modifier.isStatic(field.getModifiers())) {
    		shouldFollow = false;
    		/* don't blaber about static fields, too many of them */
    		return new Pair<Boolean,List<String>>(shouldFollow,reasons);
    	}
    	
		/* Note: Scala compiler puts some important fields as synthetic,
		 * so don't dare skip them
		 */
		if (nestingLevel >= MAX_NESTING) {
    		shouldFollow = false;
    		reasons.add(String.format("nestingLevel %d exceeds MAX_NESTING %d",
    				nestingLevel,MAX_NESTING));
		}
		
    	if (field.getName().equals("serialVersionUID")) {
    		shouldFollow = false;
    		reasons.add("field named serialVersionUID");
    	}
    	
    	if (field.getName().equals("serialPersistentFields")) {
    		shouldFollow = false;
    		reasons.add("field named serialPersistentFields");
    	}
    	
		// Do not follow scala.collection.parallel.*TaskSupport else we
		// get into a big tangle that GraphViz chokes on
		if (o.getClass().getName().endsWith("TaskSupport")) {
			shouldFollow = false;
			reasons.add("Parent object is a TaskSupport");
		}	
		
		// Similarly, following a Class is not interesting in this context
		if (o.getClass().getName().equals("java.lang.Class")) {
			shouldFollow = false;
			reasons.add("Parent object is a java.lang.Class");
		}	
		
		if (o.getClass().getName().startsWith("java.util.concurrent.ThreadPoolExecutor")) {
			shouldFollow = false;
			reasons.add("Parent object is a java.util.concurrent.ThreadPoolExecutor");
		}
		
		if (o.getClass().getName().endsWith("Thread")) {
			shouldFollow = false;
			reasons.add("Parent object is a Thread");
		}
		
    	if (field.getName().equals("_meta")) {
    		shouldFollow = false;
    		reasons.add("field named _meta");
    	}
		return new Pair<Boolean,List<String>>(shouldFollow,reasons);
	}