private static void addDefaultValuesForType(Resource cls, Map<Property,RDFNode> results, Set<Resource> reached) {
		
		reached.add(cls);
		
		StmtIterator it = cls.listProperties(SPIN.rule);
		while(it.hasNext()) {
			Statement s = it.nextStatement();
			if(s.getObject().isResource()) {
				Resource templateCall = s.getResource();
				if(templateCall.hasProperty(RDF.type, SPL.InferDefaultValue)) {
					Statement predicateS = templateCall.getProperty(SPL.predicate);
					if(predicateS != null && predicateS.getObject().isURIResource()) {
						Property predicate = cls.getModel().getProperty(predicateS.getResource().getURI());
						if(!results.containsKey(predicate)) {
							Statement v = templateCall.getProperty(SPL.defaultValue);
							if(v != null) {
								results.put(predicate, v.getObject());
							}
						}
					}
				}
			}
		}
		
		for(Resource superClass : JenaUtil.getSuperClasses(cls)) {
			if(!reached.contains(superClass)) {
				addDefaultValuesForType(superClass, results, reached);
			}
		}
	}