def _read_dict(self, data_dict, layer=None, source=None):
        """Load a dictionary into the ConfigTree. If the dict contains nested dicts
        then the values will be added recursively. See module docstring for example code.

        Parameters
        ----------
        data_dict : dict
            source data
        layer : str
            layer to load data into. If none is supplied the outermost one is used
        source : str
            Source to attribute the values to
        """
        for k, v in data_dict.items():
            self._set_with_metadata(k, v, layer, source)