docs: def as_dict(self):
          """Returns a JSON-serializeable object representing this tree."""
          def conv(v):
              if isinstance(v, SerializableAttributesHolder):
                  return v.as_dict()
              elif isinstance(v, list):
                  return [conv(x) for x in v]
              elif isinstance(v, dict):
                  return {x:conv(y) for (x,y) in v.items()}
              else:
                  return v
          return {k.replace('_', '-'): conv(v) for (k, v) in self._attributes.items()}