Bind all unbound types to the engine.

        Bind each unbound typedef to the engine, passing in the engine and
        :attr:`config`.  The resulting ``load`` and ``dump`` functions can
        be found under ``self.bound_types[typedef]["load"]`` and
        ``self.bound_types[typedef]["dump"], respectively.

        Parameters
        ----------
        config : dict, optional
            Engine-binding configuration to pass to each typedef that will be
            bound.  Examples include floating-point precision values, maximum
            lengths for strings, or any other translation constraints/settings
            that a typedef needs to construct a load/dump function pair.

def bind(self, **config):
        """
        Bind all unbound types to the engine.

        Bind each unbound typedef to the engine, passing in the engine and
        :attr:`config`.  The resulting ``load`` and ``dump`` functions can
        be found under ``self.bound_types[typedef]["load"]`` and
        ``self.bound_types[typedef]["dump"], respectively.

        Parameters
        ----------
        config : dict, optional
            Engine-binding configuration to pass to each typedef that will be
            bound.  Examples include floating-point precision values, maximum
            lengths for strings, or any other translation constraints/settings
            that a typedef needs to construct a load/dump function pair.

        """
        while self.unbound_types:
            typedef = self.unbound_types.pop()
            try:
                load, dump = typedef.bind(self, **config)
                self.bound_types[typedef] = {
                    "load": load, "dump": dump
                }
            except Exception:
                self.unbound_types.add(typedef)
                raise