def METHOD_NAME(cls) -> List[Tuple[Field, str]]:
    if cls._mapped_fields is None:
        cls._mapped_fields = {}
    if cls.__name__ not in cls._mapped_fields:
        mapped_fields = []
        type_hints = get_type_hints(cls)
        for f in fields(cls):  # type: ignore
            # Skip internal fields
            if f.name.startswith("_"):
                continue
            # Note fields() doesn't resolve forward refs
            f.type = type_hints[f.name]
            # hologram used the "field_mapping" here, but we use the
            # the field's metadata "alias". Since this method is mainly
            # just used in merging config dicts, it mostly applies to
            # pre-hook and post-hook.
            field_name = f.metadata.get("alias", f.name)
            mapped_fields.append((f, field_name))
        cls._mapped_fields[cls.__name__] = mapped_fields
    return cls._mapped_fields[cls.__name__]