public <T> T unmap(Map<String, ?> genericised, Class<T> type) {
		ReMapperMeta meta = extractMeta(genericised);
		if (meta == null) {
			//assume this is a hash map
			System.err.println("__ null meta: umm... what now?");
		}
		if (meta != null) {
			//note: its possible for the type to change (specialisation - to a sub sol
			Class<?> metaType = meta.getType();
			if (!type.isAssignableFrom(metaType))
				throw new RuntimeException("Type " + metaType + " is not a subclass of expected type " + type);
			Object instance;
			try {
				instance = metaType.newInstance();
			} catch (Exception e) {
				throw new RuntimeException(e);
			}
			
			for(String fieldName: genericised.keySet()) {
				if (fieldName.equals(metaTagName))
					continue;

				PersistentFieldMeta persistentFieldMeta = getPersistentFieldMeta(metaType, fieldName);
				if (persistentFieldMeta == null)
					continue; //eg - an unmapped auto field (like _id for MongoDB)
				Object value = fullUnmap(genericised.get(fieldName), persistentFieldMeta.getType());
				persistentFieldOperator.set(instance, persistentFieldMeta, value);
			}
			
			
			return (T)instance;
		}
		
		
		throw new RuntimeException("Unable to unmap: " + genericised);
	}