class DebugMsmStrategy : public DecoratorMsmStrategy {
 public:
  DebugMsmStrategy(MsmStrategy* strategy):
    DecoratorMsmStrategy(strategy),
    _level(0) {
  }
  
  virtual void doingIndependenceSplit(const MsmSlice& slice,
				      Ideal* mixedProjectionSubtract) {
    fprintf(stderr, "DEBUG %lu: doing independence split.\n",
	    (unsigned long)_level);
    fflush(stderr);
    DecoratorMsmStrategy::doingIndependenceSplit
      (slice, mixedProjectionSubtract);
  }

  virtual void doingIndependentPart(const Projection& projection, bool last) {
    fprintf(stderr, "DEBUG %lu: doing independent part\n",
	    (unsigned long)_level);
    if (last)
      fputs(" (last)", stderr);
    fputs(".\n", stderr);
    fflush(stderr);
    DecoratorMsmStrategy::doingIndependentPart(projection, last);
  }

  virtual bool doneWithIndependentPart() {
    fprintf(stderr, "DEBUG %lu: done with that independent part.\n",
	    (unsigned long)_level);
    fflush(stderr);
    
    return DecoratorMsmStrategy::doneWithIndependentPart();
  }
  
  virtual void doneWithIndependenceSplit() {
    fprintf(stderr, "DEBUG %lu: done with independence split.\n",
	    (unsigned long)_level);
    fflush(stderr);
    DecoratorMsmStrategy::doneWithIndependenceSplit();
  }

  void getPivot(Term& pivot, MsmSlice& slice) {
    DecoratorMsmStrategy::getPivot(pivot, slice);
    fprintf(stderr, "DEBUG %lu: performing pivot split on ",
	    (unsigned long)_level);
    pivot.print(stderr);
    fputs(".\n", stderr);
    fflush(stderr);
  }

  size_t getLabelSplitVariable(const MsmSlice& slice) {
    size_t var = DecoratorMsmStrategy::getLabelSplitVariable(slice);
    fprintf(stderr, "DEBUG %lu: performing label split on var %lu.\n",
	    (unsigned long)_level,
	    (unsigned long)var);
    fflush(stderr);
    return var;
  }

  void consume(const Term& term) {
    fprintf(stderr, "DEBUG %lu: Writing ", (unsigned long)_level);
    term.print(stderr);
    fputs(" to output.\n", stderr);
    fflush(stderr);

    DecoratorMsmStrategy::consume(term);
  }
  
private:
  size_t _level;
};
