public ClassMetadata getClassMetadata(final Class<?> clz) throws ClassNotFoundException {
		if (clz == null) return null;
		
		// Check cache
		String clzName = clz.getCanonicalName();
		if (classMetadataCache.containsKey(clzName)) return classMetadataCache.get(clzName);
		
		// Build new metadata and put them into cache
		ClassMetadata classMetadata = new ClassMetadata(clz);
		classMetadataCache.put(clzName, classMetadata);
		return classMetadata;
	}