def METHOD_NAME(self, cls, source):
    assert issubclass(cls, BaseTable)
    if isinstance(source, cls):
        return source
    callbackKey = (cls,)
    fmt = None
    if issubclass(cls, FormatSwitchingBaseTable):
        fmt, source = _split_format(cls, source)
        callbackKey = (cls, fmt)
    dest = self._callbackTable.get(
        (BuildCallback.CREATE_DEFAULT,) + callbackKey, lambda: cls()
    )()
    assert isinstance(dest, cls)
    convByName = _assignable(cls.convertersByName)
    skippedFields = set()
    # For format switchers we need to resolve converters based on format
    if issubclass(cls, FormatSwitchingBaseTable):
        dest.Format = fmt
        convByName = _assignable(convByName[dest.Format])
        skippedFields.add("Format")
    # Convert sequence => mapping so before thunk only has to handle one format
    if _isNonStrSequence(source):
        # Sequence (typically list or tuple) assumed to match fields in declaration order
        assert len(source) <= len(
            convByName
        ), f"Sequence of {len(source)} too long for {cls}; expected <= {len(convByName)} values"
        source = dict(zip(convByName.keys(), source))
    dest, source = self._callbackTable.get(
        (BuildCallback.BEFORE_BUILD,) + callbackKey, lambda d, s: (d, s)
    )(dest, source)
    if isinstance(source, collections.abc.Mapping):
        for field, value in source.items():
            if field in skippedFields:
                continue
            converter = convByName.get(field, None)
            if not converter:
                raise ValueError(
                    f"Unrecognized field {field} for {cls}; expected one of {sorted(convByName.keys())}"
                )
            self._convert(dest, field, converter, value)
    else:
        # let's try as a 1-tuple
        dest = self.METHOD_NAME(cls, (source,))
    for field, conv in convByName.items():
        if not hasattr(dest, field) and isinstance(conv, OptionalValue):
            setattr(dest, field, conv.DEFAULT)
    dest = self._callbackTable.get(
        (BuildCallback.AFTER_BUILD,) + callbackKey, lambda d: d
    )(dest)
    return dest