def _supervise(plugin, task, *args)
      catch self.class.stopping_symbol_for(plugin) do
        plugin.hook("#{ task }_begin", *args)
        result = UI.options.with_progname(plugin.class.name) do
          begin
            plugin.send(task, *args)
          rescue Interrupt
            throw(:task_has_failed)
          end
        end
        plugin.hook("#{ task }_end", result)
        result
      end
    rescue ScriptError, StandardError, RuntimeError
      UI.error("#{ plugin.class.name } failed to achieve its"\
                        " <#{ task }>, exception was:" \
                        "\n#{ $!.class }: #{ $!.message }" \
                        "\n#{ $!.backtrace.join("\n") }")
      Guard.state.session.plugins.remove(plugin)
      UI.info("\n#{ plugin.class.name } has just been fired")
      $!
    end
def _supervise(plugin, task, *args)
      catch self.class.stopping_symbol_for(plugin) do
        plugin.hook("#{ task }_begin", *args)
        result = UI.options.with_progname(plugin.class.name) do
          begin
            plugin.send(task, *args)
          rescue Interrupt
            throw(:task_has_failed)
          end
        end
        plugin.hook("#{ task }_end", result)
        result
      end
    rescue ScriptError, StandardError, RuntimeError
      UI.error("#{ plugin.class.name } failed to achieve its"\
                        " <#{ task }>, exception was:" \
                        "\n#{ $!.class }: #{ $!.message }" \
                        "\n#{ $!.backtrace.join("\n") }")
      Guard.state.session.plugins.remove(plugin)
      UI.info("\n#{ plugin.class.name } has just been fired")
      $!
    end
Run a Guard plugin task, but remove the Guard plugin when his work leads
 to a system failure.

 When the Group has `:halt_on_fail` disabled, we've to catch
 `:task_has_failed` here in order to avoid an uncaught throw error.

 @param [Guard::Plugin] plugin guard the Guard to execute
 @param [Symbol] task the task to run
 @param [Array] args the arguments for the task
 @raise [:task_has_failed] when task has failed