docs: public Object invoke(final Object proxy, final Method method, final Object[] args) {
  		
  		final String methodName = method.getName();
  		
  		if( methodName.startsWith(GET_PREFIX) ) {
  			
  			if( method.getParameterTypes().length > 0 ) {
  				throw new IllegalArgumentException(String.format(
  					"method %s.%s() should have no parameters to be a valid getter", method.getDeclaringClass()
  						.getName(), methodName));
  			}
  			
  			// simulate getter by retrieving value from bean state
  			return beanState.get(methodName.substring(GET_PREFIX.length()));
  			
  		} else if( methodName.startsWith(SET_PREFIX) ) {
  			
  			if( args == null || args.length != 1 ) {
  				throw new IllegalArgumentException(String.format(
  					"method  %s.%s() should have exactly one parameter to be a valid setter", method
  						.getDeclaringClass().getName(), methodName));
  			}
  			
  			// simulate setter by storing value in bean state
  			beanState.put(methodName.substring(SET_PREFIX.length()), args[0]);
  			return proxy;
  			
  		} else {
  			throw new IllegalArgumentException(String.format("method %s.%s() is not a valid getter/setter", method
  				.getDeclaringClass().getName(), methodName));
  		}
  		
  	}