Apply additional configuration from any Python object

        This will look for object attributes that exist in the base_config and apply their values  on the current
        configuration object

def apply_object(self, config_obj, apply_on=None):
        # type: (object, Optional[Tuple[str, ...]]) -> None
        """Apply additional configuration from any Python object

        This will look for object attributes that exist in the base_config and apply their values  on the current
        configuration object
        """
        self._init_flat_pointers()
        try:
            config_obj_keys = vars(config_obj).keys()  # type: Iterable[str]
        except TypeError:
            config_obj_keys = filter(lambda k: k[0] != '_', dir(config_obj))

        for config_key in config_obj_keys:
            if apply_on:
                flat_key = apply_on + (config_key, )
            else:
                flat_key = (config_key, )

            if flat_key in self._flat_pointers:
                container, orig_key = self._flat_pointers[flat_key]
                container[orig_key] = getattr(config_obj, config_key)