docs: protected NodeFilter sharedNodesFilter() {
          return new NodeFilter() {
              private final Set<NodeKey> shareableNodeKeys = new HashSet<>();
  
              @Override
              public boolean includeNode( CachedNode node,
                                          NodeCache cache ) {
                  if (nodeTypes.isShareable(node.getPrimaryType(cache), node.getMixinTypes(cache))) {
                      NodeKey key = node.getKey();
                      if (shareableNodeKeys.contains(key)) {
                          return false;
                      }
                      // we're seeing the original shareable node, so we need to process it
                      shareableNodeKeys.add(key);
                      return true;
                  }
                  return true;
              }
  
              @Override
              public boolean continueProcessingChildren( CachedNode node, NodeCache cache ) {
                  return !shareableNodeKeys.contains(node.getKey());
              }
  
              @Override
              public String toString() {
                  return "(excludes-sharables)";
              }
          };
      }