I just saw

std::cerr << std::string(depth, ‘ ‘) << object.description() << std::endl;

and I feel like such an idiot for not thinking to do dynamic indentation with that constructor.