private List<Repository> getRepositories(final String organizationName) throws IOException {
        try {
            return repoListCache.get(organizationName, new Callable<List<Repository>>() {

                @Override
                public List<Repository> call() throws IOException {
                    logger.log(Level.INFO, "Getting and caching list of repositories for {0}.", organizationName);
                    
                    RepositoryService repositoryService = new RepositoryService(connectToGitHub());
                    List<Repository> repositories = repositoryService.getOrgRepositories(organizationName);
                    if (repositories == null) {
                        // Callable must return a value or throw an exception - can't return null
                        throw new IllegalArgumentException();
                    }
                    return repositories;
                }
            });
        }
        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());
        }
    }