"""
"""
from collections import OrderedDict
import inspect
[docs]def init_arg_capture(method):
"""A decorator that wraps a Type's `__init__` method for the purpose of
capturing the arguments used when a Type is instantiated so it can then
update the instance's argspec with what was actually used.
"""
def wrapper(self, *a, **kw):
method(self, *a, **kw)
init_args = OrderedDict()
init_args.update(self._schematic._argspec)
for k, v in kw.items():
init_args[k] = v
self._schematic._init_args = init_args
return wrapper
[docs]class Schematic(object):
"""A Schematic is a object that maintains a Type's argspec. It exists as a
class to provide a namespace for relevant values.
"""
def __init__(self, klass):
"""Initialize a Schematic instance with a Typerighter Type instance.
:param class klass:
"""
argspec = OrderedDict()
# aggregate argspec from base classes
base_classes = inspect.getmro(klass)
for base in base_classes:
if hasattr(base, '_schematic'):
if hasattr(base._schematic, '_argspec'):
argspec.update(base._schematic._argspec)
# add argspec
k_argspec = extract_argspec(klass)
argspec.update(k_argspec)
self._argspec = argspec
# this decorator must be applied *after* argspec is read
klass.__init__ = init_arg_capture(klass.__init__)