@Override
    public V compute(final A toCompute) throws InterruptedException {
        Future<V> maybeComputedFuture = cache.get(toCompute);
        if (maybeComputedFuture == null) {
            Callable<V> eval = new Callable<V>() {
                @Override
                public V call() throws InterruptedException {
                    return computator.compute(toCompute);
                }
            };
            FutureTask<V> maybeComputedFutureTask = new FutureTask<V>(eval);
            maybeComputedFuture = maybeComputedFutureTask;
            cache.put(toCompute, maybeComputedFuture);
            maybeComputedFutureTask.run();
        }
        try {
            return maybeComputedFuture.get();
        } catch (ExecutionException ex) {
            throw new RuntimeException();
        }
    }