class_docstr: A publisher class that combines the logic of multiple other publishers together in series
  
  To reduce the chance that one publisher has side effects in other publishers in the chain,
  we use deepcopy between the publishers.
  
  Note: This publisher is not meant to be @Register'd as it does not have any logic on its own.
        It is only meant to be composed by AlertPublisherRepository to give a common interface to
        multiple publishers chained in sequence.
class_docstr_tok: ["A","publisher","class","that","combines","the","logic","of","multiple","other","publishers","together","in","series","To","reduce","the","chance","that","one","publisher","has","side","effects","in","other","publishers","in","the","chain",",","we","use","deepcopy","between","the","publishers",".","Note",":","This","publisher","is","not","meant","to","be","@","Register","'d","as","it","does","not","have","any","logic","on","its","own",".","It","is","only","meant","to","be","composed","by","AlertPublisherRepository","to","give","a","common","interface","to","multiple","publishers","chained","in","sequence","."]
code: def __init__(self, publishers):
      self._publishers = publishers  # Type list(AlertPublisher)
  
      for publisher in self._publishers:
          if not isinstance(publisher, AlertPublisher):
              LOGGER.error("CompositePublisher given invalid publisher")
  
imports: from abc import abstractmethod
  from copy import deepcopy
  from inspect import isclass
  from streamalert.shared.config import load_config
  from streamalert.shared.importer import import_folders
  from streamalert.shared.logger import get_logger
label_desc: Use image node_id 1 to create a new CompositePublisher object from inherited base classes: AlertPublisher with example: obj = CompositePublisher(publishers)