private List<Release> getReleases(final Repository repository) throws IOException {
        try {
            return repoReleasesCache.get(repository.getName(), new Callable<List<Release>>() {
                
                @Override
                public List<Release> call() throws IOException {
                    logger.log(Level.INFO, "Getting and caching releases for {0}.", repository.getName());
                    
                    ReleaseService releaseService = new ReleaseService(connectToGitHub());
                    List<Release> releases = releaseService.getReleases(repository, 1, 1);
                    if (releases == null) {
                        // Callable must return a value or throw an exception - can't return null
                        throw new IllegalArgumentException();
                    }
                    return releases;
                }
            });
        }
        catch (ExecutionException e) {
            if (e.getCause() instanceof IOException) {
                throw (IOException)e.getCause();
            }
            // Callable should only throw an IOException. If we get here, something fishy is going on...
            throw new IllegalStateException(e.getCause());
        }
    }