code: def _create_attr(self, property_key, data, ancestors):
          
          if not isinstance(property_key, six.string_types):
              raise TypeError("property_key must be a string. type: {0} was passed.".format(type(property_key)))
  
          if not isinstance(ancestors, OrderedDict):
              raise TypeError("ancestors must be an OrderedDict. type: {0} was passed.".format(type(ancestors)))
  
          previous_element        = self
          normalized_key          = normalize_value(property_key).replace('-', '_')
          normalized_ancestor_key = None
  
          # TODO: clean up and validation
          if ancestors:
              for ancestor_key, ancestors_value in six.iteritems(ancestors):
                  normalized_ancestor_key = normalize_value(ancestor_key).replace('-', '_')
  
                  if normalized_ancestor_key.lower() == 'root':
                      continue
  
                  if not hasattr(previous_element, normalized_ancestor_key):
                      config_attr       = ConfigDict({}, ancestors_value.start_mark, ancestors_value.end_mark)
                      config_attr.name  = normalized_ancestor_key
                      config_attr.alias = ancestor_key
  
                      setattr(
                          previous_element,
                          normalized_ancestor_key,
                          config_attr
                      )
  
                  previous_element = getattr(previous_element, normalized_ancestor_key)
  
          if normalized_key == normalized_ancestor_key:
              pass
          else:
              if isinstance(data, ConfigNode):
                  data.name  = normalized_key
                  data.alias = property_key
  
              setattr(previous_element, normalized_key, data)
docs: Dynamically Creates attributes on for a Config.  Also adds name and alias to each Config object.
  
          :param property_key: A :string: configuration property name.
          :param data: The adds the user supplied for this specific property.
          :param ancestors: A :OrderedDict: that provides a history of its ancestors.