code: @Override
      public T merge(Archive<?> source, ArchivePath path, Filter<ArchivePath> filter) throws IllegalArgumentException {
          // Precondition checks
          Validate.notNull(source, "No source archive was specified");
          Validate.notNull(path, "No path was specified");
          Validate.notNull(filter, "No filter was specified");
  
          // Get existing contents from source archive
          final Map<ArchivePath, Node> sourceContent = source.getContent();
          Validate.notNull(sourceContent, "Source archive content can not be null.");
  
          // Add each asset from the source archive
          for (final Entry<ArchivePath, Node> contentEntry : sourceContent.entrySet()) {
              final Node node = contentEntry.getValue();
              ArchivePath nodePath = new BasicPath(path, contentEntry.getKey());
              if (!filter.include(nodePath)) {
                  continue;
              }
              // Delegate
              if (node.getAsset() == null) {
                  addAsDirectory(nodePath);
              } else {
                  add(node.getAsset(), nodePath);
              }
          }
          return covariantReturn();
      }
docs: {@inheritDoc}
  
  @see org.jboss.shrinkwrap.api.Archive#merge(org.jboss.shrinkwrap.api.Archive, org.jboss.shrinkwrap.api.Path,
  org.jboss.shrinkwrap.api.Filter)