import typing
import inspect


def extract_config(conf: typing.Any) -> typing.Dict[str, typing.Any]:
    """Creates a ``dict`` that summarizes the values stored in a configuration object.

    As usual, this function considers all public mutable properties.

    Args:
        conf: The object that contains the configuration to extract.

    Returns:
        dict: Maps the names of the considered members to their according values.
    """

    if conf is None:
        raise TypeError("<conf> must not be None!")

    str_conf = {}  # -> used to store the extracted configuration

    # find all public mutable properties -> these are considered as config values
    for name, field in inspect.getmembers(type(conf), lambda f: isinstance(f, property)):

        # only consider public properties that have an according setter method
        if not name.startswith("_") and field.fset is not None:
            str_conf[name] = getattr(conf, name)

    return str_conf