private <T> T fromAttributesToIndirections(Class<T> clazz, Attributes attributes) throws NamingException {
    	try {
    		OneMetaData oneMetaData = IndirectionsMetaData.get(clazz).getOne();
    		
	    	Attribute idAttr = attributes.get(oneMetaData.getIdAttr());
			Attribute indirectionAttr = attributes.get(oneMetaData.getIndirectionAttr());
	    	
			T indirections = null;
			try {
				indirections = clazz.newInstance();
				
				String dnOfOne = oneMetaData.getIdAttr() + "=" + String.valueOf(idAttr.get()) + "," + oneMetaData.getContext();
				// @One won't be multiple.
				oneMetaData.setter().set(indirections, dnOfOne);
				
				// @TheOther is always multiple.
				TheOtherMetaData theOtherMetaData = IndirectionsMetaData.get(clazz).getTheOther();
				if (null != indirectionAttr) {
					theOtherMetaData.setter().set(indirections, new MoniteredList(AttrUtils.values(indirectionAttr)));
				} else {
					theOtherMetaData.setter().set(indirections, new MoniteredList());
				}
				
			} catch (InstantiationException e) {
				LogUtils.error(LOG, "cannot instantiate " + clazz, e);
			} catch (IllegalAccessException e) {
				LogUtils.error(LOG, "cannot instantiate " + clazz, e);
			}
			
			return IndirectionsProxyFactory.getProxiedIndirections(indirections);
			
    	} catch (NamingException e) {
    		LogUtils.debug(LOG, "failed to go through attributes when fromAttributesToIndirections");
    		throw e;
    	}
    }