public Object invoke(Object proxy, Method method, Object[] args) {

		/* Business method logic: this should implement it */
		if (method.isAnnotationPresent(BusinessLogic.class)) 
			return execMethod(this, method, args);
			
		/* Getters */
		if (CommonStatic.isAGetter(method)){
		
			String mN = factory.getCache().fieldName(method);
			Class  rT = method.getReturnType();
			
			if (!method.isAnnotationPresent(Connection.class))
				return get(mN, rT);
				
			else {
				Connection c = method.getAnnotation(Connection.class);
				
				if (rT.isArray()) 
					return getConnectionArray(mN, rT.getComponentType(), c);
					
				else return getConnection(mN, rT, c);
			}
		}
		
		/* Setters */
		if (CommonStatic.isASetter(method) && 
			!method.isAnnotationPresent(Connection.class)) {
			
			//TODO: Checks the connections - handle them differently
			String mN = factory.getCache().fieldName(method);		
			
			if (args.length != 1) 
				throw new ModelRuntimeException("Invalid setter arguments " + 
				"length: " + mN);
			
			set(mN, args[0]); return null;
		}
			
		return execMethod(this, method, args);
	}