code: def prepare_delete(self, node, method, position=None, save=True):
          
          # If no delete method preference is specified, use attribute.
          if method is None:
              method = node._cte_node_delete_method
          # If no preference specified, use default.
          if method == self.DELETE_METHOD_NONE:
              method = self.DEFAULT_DELETE_METHOD
          # Delegate to appropriate method.
          getattr(self, "prepare_delete_%s" % method)(node, position, save)
docs: Prepares a given :class:`CTENode` `node` for deletion, by executing
              the required deletion semantics (Pharaoh, Grandmother, or Monarchy).
  
              The `method` argument can be one of the valid
              :const:`DELETE_METHODS` choices. If it is
              :const:`DELETE_METHOD_NONE` or ``None``, then the default delete
              method will be used (as specified from the optional
              :attr:`_cte_node_delete_method`).
  
              Under the :const:`DELETE_METHOD_GRANDMOTHER` and
              :const:`DELETE_METHOD_MONARCHY` delete semantics, descendant nodes
              may be moved; in this case the optional `position` can be a
              ``callable`` which is invoked prior to each move operation (see
              :meth:`move` for details).
  
              Furthermore, by default, after each move operation, sub-tree nodes
              which were moved will be saved through a call to :meth:`Model.save`
              unless `save` is ``False``.
  
              This method delegates move operations to :meth:`move`.
  
              :param node: the :class:`CTENode` to prepare for deletion.
  
              :param method: optionally, a delete method to use.
  
              :param position: optionally, a ``callable`` to invoke prior to each
                  move operation.
  
              :param save: flag indicating whether to save after each move
                  operation, ``True`` by default.