This implementation of a {@link reactor.event.routing.ConsumerInvoker} will attempt to invokea {@link Consumer} as-is and, if that fails with a {@link ClassCastException} because theargument declared in the {@literal Consumer} isn't of the correct type, it tries to find anobject of that type in the array of possible arguments passed to the invoker. If that fails, it will attempt to use a {@link Converter} to convert the argument into a form acceptable tothe {@literal Consumer}. If the argument is of type {@link Event} and the data inside thatevent is of a compatible type with the argument to the consumer, this invoker will unwrap that {@literal Event} and try to invoke the consumer using the data itself.
Finally, if the {@literal Consumer} also implements {@link Callable}, then it will invoke the {@link Callable#call()} method to obtain a return value and return that. Otherwise it will return{@literal null} or throw any raised exceptions.
@author Jon Brisbin
@author Stephane Maldini