public Iterable<Node<T>> getSuccessors(Node<T> node, NodeType type) {
    // check cache first

    NodeItem<T> cachedSuccessorNodes = cache.get(node);

    if (cachedSuccessorNodes == null || cachedSuccessorNodes.getNodeType() != type) {
      // compute new results.
      // LOG.debug("cache miss with node: "+node.getId());
      Iterable<Node<T>> computedSuccessors = workerSuccessorService.getSuccessors(node, type);
      // add to cache

      cachedSuccessorNodes = new NodeItem<T>(type, computedSuccessors, node);
      cache.put(node, cachedSuccessorNodes);
    } else {
      LOG.debug("cache hit with node: " + node.getId());
    }

    return cachedSuccessorNodes.getSuccessors();
  }
 public Iterable<NodeVisitor<T>> getRequestedVisitors() {
   return Iterables.concat(
       Lists.<NodeVisitor<T>>newArrayList(this), workerSuccessorService.getRequestedVisitors());
 }