# File lib/backup/model.rb, line 239
    def perform!
      @started_at = Time.now
      @time = @started_at.strftime("%Y.%m.%d.%H.%M.%S")
      log!(:started)

      if databases.any? or archives.any?
        procedures.each do |procedure|
          (procedure.call; next) if procedure.is_a?(Proc)
          procedure.each(&:perform!)
        end
      end

      syncers.each(&:perform!)
      notifiers.each(&:perform!)
      log!(:finished)

    rescue Exception => err
      fatal = !err.is_a?(StandardError)

      err = Errors::ModelError.wrap(err, "Backup for \#{label} (\#{trigger}) Failed!\nAn Error occured which has caused this Backup to abort before completion.\n")
      Logger.error err
      Logger.error "\nBacktrace:\n\s\s" + err.backtrace.join("\n\s\s") + "\n\n"

      Cleaner.warnings(self)

      if fatal
        Logger.error Errors::ModelError.new("This Error was Fatal and Backup will now exit.\nIf you have other Backup jobs (triggers) configured to run,\nthey will not be processed.\n")
      else
        Logger.message Errors::ModelError.new("If you have other Backup jobs (triggers) configured to run,\nBackup will now attempt to continue...\n")
      end

      notifiers.each do |n|
        begin
          n.perform!(true)
        rescue Exception; end
      end

      exit(1) if fatal
    end