code: function SelfEvict(ringpop) {
      /* istanbul ignore if */
      if (!(this instanceof SelfEvict)) {
          return new SelfEvict(ringpop);
      }
  
      /**
       * The ringpop instance
       * @type {RingPop}
       * @private
       */
      this.ringpop = ringpop;
  
      /**
       *
       * @type {Object.<string, SelfEvictHooks>}
       */
      this.hooks = {};
  
      /**
       * The callback to be called after self eviction is complete.
       * @type {SelfEvict~callback}
       * @private
       */
      this.callback = null;
  
      /**
       * The history of phases
       * @type {[Phase]}
       */
      this.phases = [];
  }
docs: A callback used when calling Hooks
  @callback SelfEvict~HookCallback
   
  Self eviction provides a way to graceful shut down a ringpop service.
  A self eviction consists of the following phases:
  1. PreEvict: the preEvict hooks are invoked;
  2. Evict: The node will mark  itself as faulty causing an eviction out of the membership;
  3. PostEvict: the postEvict hooks are invoked;
  4. Done: self eviction is done and ringpop is ready to be shut down.
  
  @param {RingPop} ringpop
  @return {SelfEvict}
  @constructor