chronos/src/main/java/com/redmadrobot/chronos/ChronosListener.java
@SuppressWarnings("TryWithIdenticalCatches")
    private void deliverResult(@NonNull final ChronosOperationResult<?> operationResult,
            @NonNull final String methodName, final boolean warnIfNoCallback) {
        final Class listenerClass = mServiceListener.getClass();
        final Method[] listenerMethods = listenerClass.getMethods();

        Method callbackMethod = null;

        final Class resultClass = operationResult.getClass();
        for (Method method : listenerMethods) {
            if (isCallback(method, resultClass, methodName)) {
                callbackMethod = method;
                try {
                    callbackMethod.invoke(mServiceListener, operationResult);
                } catch (IllegalAccessException e) {
                    Log.w(LOG_TAG, Log.getStackTraceString(e));
                } catch (InvocationTargetException e) {
                    Log.w(LOG_TAG, Log.getStackTraceString(e));
                }
            }
        }

        if (warnIfNoCallback && callbackMethod == null) {
            Log.w(LOG_TAG,
                    "Operation result (id=" + operationResult.getId() + "; class=" + operationResult
                            .getClass().getName() + ") was obtained, but there is no method in "
                            + mServiceListener + " to get it"
            );
            Log.w(LOG_TAG, "Method should look like");
            Log.w(LOG_TAG,
                    "public void " + methodName + "(" + resultClass.getName()
                            + " result) {}"
            );
        }
    }
@SuppressWarnings("TryWithIdenticalCatches")
    private void deliverResult(@NonNull final ChronosOperationResult<?> operationResult,
            @NonNull final String methodName, final boolean warnIfNoCallback) {
        final Class listenerClass = mServiceListener.getClass();
        final Method[] listenerMethods = listenerClass.getMethods();

        Method callbackMethod = null;

        final Class resultClass = operationResult.getClass();
        for (Method method : listenerMethods) {
            if (isCallback(method, resultClass, methodName)) {
                callbackMethod = method;
                try {
                    callbackMethod.invoke(mServiceListener, operationResult);
                } catch (IllegalAccessException e) {
                    Log.w(LOG_TAG, Log.getStackTraceString(e));
                } catch (InvocationTargetException e) {
                    Log.w(LOG_TAG, Log.getStackTraceString(e));
                }
            }
        }

        if (warnIfNoCallback && callbackMethod == null) {
            Log.w(LOG_TAG,
                    "Operation result (id=" + operationResult.getId() + "; class=" + operationResult
                            .getClass().getName() + ") was obtained, but there is no method in "
                            + mServiceListener + " to get it"
            );
            Log.w(LOG_TAG, "Method should look like");
            Log.w(LOG_TAG,
                    "public void " + methodName + "(" + resultClass.getName()
                            + " result) {}"
            );
        }
    }
Call bound client methods to pass an operation result.

@param operationResult  an operation result to be delivered
@param methodName       a name of a method that will be called
@param warnIfNoCallback {@code true} if a warning message should be posted to LogCat if there
is no suitable method in the bound client; {@code false} otherwise