--- /dev/null
+from collections import defaultdict
+from io import StringIO
+from textwrap import indent
+
+
+class CodeWriter(StringIO):
+ """
+ Blob of text that, when used in the context of facade.py, ends up
+ holding the source code for a Python class and associated methods.
+
+ """
+ INDENT = " "
+
+ CLASS = 0
+ METHOD = 1
+
+ def write(self, msg, depth=0):
+ if depth:
+ prefix = self.INDENT * depth
+ msg = indent(msg, prefix)
+
+ return super(CodeWriter, self).write(msg)
+
+ def __str__(self):
+ return super(CodeWriter, self).getvalue()
+
+
+class Capture(defaultdict):
+ """
+ A collection of CodeWriter objects, together representing a Python
+ module.
+
+ """
+
+ def __init__(self, default_factory=CodeWriter, *args, **kwargs):
+ super(Capture, self).__init__(default_factory, *args, **kwargs)
+
+ def clear(self, name):
+ """
+ Reset one of the keys in this class, if it exists.
+
+ This is necessary, because we don't worry about de-duplicating
+ the schemas for each version of juju up front, and this gives
+ us a way to sort of de-duplicate on the fly, by resetting a
+ specific CodeWriter instance before we start to write a class
+ into it.
+
+ """
+ try:
+ del self[name]
+ except KeyError:
+ pass