def METHOD_NAME(self, merge_source):
    """Merge keys from merge_source into this config object
    Return True if new keys were merged, False otherwise
    """
    added_new_key = False
    # Recurse into the data and add missing items
    work_queue = [(self._data, merge_source)]
    while work_queue:
        data, default = work_queue.pop()
        for key, value in default.items():
            if key not in data:
                # Copy defaults for missing key
                data[key] = copy.deepcopy(value)
                added_new_key = True
            elif isinstance(value, dict):
                # Recurse into sub-dictionaries
                work_queue.append((data[key], value))
            elif type(value) != type(data[key]):  # noqa
                # Type mismatch of current value and default
                if isinstance(value, int) and isinstance(data[key], float):
                    # Convert float to int if default value is int
                    data[key] = int(data[key])
    return added_new_key