@Override
    public <T> T sendAndReceive(Query query) throws NoHandlerRegisteredException, UnexpectedQueryReturnType {
        Class<? extends Query> type = query.getClass();
        Object handler = Objects.get(query.getClass());
        if (handler == null) {
            LOG.info("No query handler declared for query " + type.getName());
            throw new NoHandlerRegisteredException("");
        }
        for (Method method : handler.getClass().getMethods()) {
            if (method.isAnnotationPresent(QueryHandler.class)
                    && method.getParameterTypes().length == 1
                    && method.getParameterTypes()[0].equals(query.getClass())) {
                try {
                    return (T) method.invoke(handler, query);
                } catch (IllegalAccessException e) {
                    throw new RuntimeException(e);
                } catch (InvocationTargetException e) {
                    throw new RuntimeException(e);
                } catch (ClassCastException classCastException) {
                    throw new UnexpectedQueryReturnType(String.format("Unexpected Result of type %s", UnexpectedQueryReturnType.class.getSimpleName()), classCastException);
                }
            }
        }
        throw new NoHandlerRegisteredException(String.format("Could not find handler for query: :s", query));
    }