docs: def missing_property_names(self):
          """
          Returns a list of properties which are required and missing.
  
          Properties are excluded from this list if they are allowed to be null.
  
          :return: list of missing properties.
          """
  
          propname = lambda x: self.__prop_names__[x]
          missing = []
          for x in self.__required__:
  
              # Allow the null type
              propinfo = self.propinfo(propname(x))
              null_type = False
              if 'type' in propinfo:
                  type_info = propinfo['type']
                  null_type = (type_info == 'null'
                               or isinstance(type_info, (list, tuple))
                               and 'null' in type_info)
              elif 'oneOf' in propinfo:
                  for o in propinfo['oneOf']:
                      type_info = o.get('type')
                      if type_info and type_info == 'null' \
                              or isinstance(type_info, (list, tuple)) \
                              and 'null' in type_info:
                          null_type = True
                          break
  
              if (propname(x) not in self._properties and null_type) or \
                      (self._properties[propname(x)] is None and not null_type):
                  missing.append(x)
  
          return missing