docs: def _teardown(self):
          '''
          Put the original method back in place. This will also handle the
          special case when it putting back a class method.
  
          The following code snippet best describe why it fails using settar,
          the class method would be replaced with a bound method not a class
          method.
  
          >>> class Example(object):
          ...     @classmethod
          ...     def a_classmethod(self):
          ...         pass
          ...
          >>> Example.__dict__['a_classmethod']
          <classmethod object at 0x7f5e6c298be8>
          >>> orig = getattr(Example, 'a_classmethod')
          >>> orig
          <bound method type.a_classmethod of <class '__main__.Example'>>
          >>> setattr(Example, 'a_classmethod', orig)
          >>> Example.__dict__['a_classmethod']
          <bound method type.a_classmethod of <class '__main__.Example'>>
  
          The only way to figure out if this is a class method is to check and
          see if the bound method im_self is a class, if so then we need to wrap
          the function object (im_func) with class method before setting it back
          on the class.
          '''
          # Figure out if this is a class method and we're unstubbing it on the
          # class to which it belongs. This addresses an edge case where a
          # module can expose a method of an instance. e.g gevent.
          if hasattr(self._obj, '__self__') and \
                  inspect.isclass(self._obj.__self__) and \
                  self._obj.__self__ is self._instance:
              setattr(
                  self._instance, self._attr, classmethod(self._obj.__func__))
          elif hasattr(self._obj, 'im_self') and \
                  inspect.isclass(self._obj.im_self) and \
                  self._obj.im_self is self._instance:
              # Wrap it and set it back on the class
              setattr(self._instance, self._attr, classmethod(self._obj.im_func))
          else:
              setattr(self._instance, self._attr, self._obj)