class_docstr: This optimizer performs two important functions:
  
  1) It has a 'requirement' of the destroyhandler. This means that the fgraph
  will include it as a feature for this optimization, and keep this feature
  enabled for subsequent optimizations. All optimizations that work inplace
  on any of their inputs must run *after* this optimization to ensure that
  the DestroyHandler has been included in the fgraph.
  
  2) It tries to replace each output with an Op that purports to destroy it
  (but it won't I promise). If this replacement succeeds it means that
  there is a bug in theano. It should not be possible to destroy outputs.
code: def add_requirements(self, fgraph):
      super(AddDestroyHandler, self).add_requirements(fgraph)
      fgraph.attach_feature(gof.DestroyHandler())
  
imports: from __future__ import absolute_import, print_function, division
  import logging
  import warnings
  import theano
  from theano import gof
  import theano.gof.vm
  from theano import config
  from six import string_types
  from theano.compile.function_module import Supervisor
label_desc: Use image node_id 2 for calling the AddDestroyHandler obj's underlying member method code with example usage: obj.add_requirements(fgraph) without return types