reportDetailed(sender, reportBuilder.build());
  }
  
  @Override
  public void reportDetailed(Object sender, Report report) {
    final Plugin plugin = pluginReference.get();
    final int errorCount = internalErrorCount.incrementAndGet();
    
    // Do not overtly spam the server!
    if (errorCount > getMaxErrorCount()) {
      // Only allow the error count at rare occations
      if (isPowerOfTwo(errorCount)) {
        // Permit it - but print the number of exceptions first
        reportWarning(this, Report.newBuilder(REPORT_EXCEPTION_COUNT).messageParam(errorCount).build());
      } else {
        // NEVER SPAM THE CONSOLE
        return;
      }
    }
    
    // Secondary rate limit
    if (!canReport(report)) {
      return;
    }
    
    StringWriter text = new StringWriter();
    PrintWriter writer = new PrintWriter(text);
    // Helpful message
    writer.println("[" + pluginName + "] INTERNAL ERROR: " + report.getReportMessage());
      writer.println("If this problem hasn't already been reported, please open a ticket");
      writer.println("at " + supportURL + " with the following data:");
      
      // Now, let us print important exception information
    writer.println("          ===== STACK TRACE =====");
    if (report.getException() != null) {
      report.getException().printStackTrace(writer);
      
    } else if (detailedReporting) {
      printCallStack(writer);
    }
    
    // Data dump!
    writer.println("          ===== DUMP =====");
    
    // Relevant parameters
    if (report.hasCallerParameters()) {
      printParameters(writer, report.getCallerParameters());
    }
    
    // Global parameters
    for (String param : globalParameters()) {
      writer.println(SECOND_LEVEL_PREFIX + param + ":");
      writer.println(addPrefix(getStringDescription(getGlobalParameter(param)), 
          SECOND_LEVEL_PREFIX + SECOND_LEVEL_PREFIX));
    }
    
    // Now, for the sender itself
    writer.println("Sender:");
    writer.println(addPrefix(getStringDescription(sender), SECOND_LEVEL_PREFIX));
    
    // And plugin
    if (plugin != null) {
      writer.println("Version:");
      writer.println(addPrefix(plugin.toString(), SECOND_LEVEL_PREFIX));
    }
    
    // Add the server version too
    if (Bukkit.getServer() != null) {
      writer.println("Server:");