code: private void printRulePhases(List<RuleProvider> allProviders)
      {
          List<RuleProvider> unsortedPhases = new ArrayList<>();
          for (RuleProvider provider : allProviders)
          {
              if (provider instanceof RulePhase)
                  unsortedPhases.add(provider);
          }
          List<RuleProvider> sortedPhases = RuleProviderSorter.sort(unsortedPhases);
          StringBuilder rulePhaseSB = new StringBuilder();
          for (RuleProvider phase : sortedPhases)
          {
              Class<?> unproxiedClass = Proxies.unwrap(phase).getClass();
              rulePhaseSB.append("\tPhase: ").append(unproxiedClass.getSimpleName()).append(System.lineSeparator());
          }
          LOG.info("Rule Phases: [\n" + rulePhaseSB.toString() + "]");
      }
docs: Prints all of the {@link RulePhase} objects in the order that they should execute. This is primarily for debug purposes and should be called
  before the entire {@link RuleProvider} list is sorted, as this will allow us to print the {@link RulePhase} list without the risk of
  user-introduced cycles making the sort impossible.