- should not be empty
        - yaml itself should be valid (should we grab more than 1 yaml error at a time?)
        - we should have whitelist of fields the can set at each level, and start
          getting objects out of those, processing grammar if necessary, validating other settings
          errors coming all the way back up

def load(self):
        """
        - should not be empty
        - yaml itself should be valid (should we grab more than 1 yaml error at a time?)
        - we should have whitelist of fields the can set at each level, and start
          getting objects out of those, processing grammar if necessary, validating other settings
          errors coming all the way back up
        """
        if not isinstance(self.config_text, str):
            self.config_text = self.config_text.decode('utf-8')

        if not self.config_text.strip():
            self._errors.append(ConfigError(title='YAML is empty', description='Your configuration file appears to be empty.'))
            return

        # simple way to check that yaml itself is valid
        try:
            self.config_dict = yaml.safe_load(self.config_text)
        except yaml.YAMLError as e:
            error = ConfigError.create_from_yaml_error(e)
            self._errors.append(error)
            # could have more than 1 line, keep giong

        if self.config_dict:
            # we have valid yaml with data, so start checking the components
            node_tree = yaml.compose(self.config_text)
            # give it the parsed settings, and the node info
            self.config_root = self.config_root_class(
                value=self.config_dict,
                value_node=node_tree,
                context=self.context,
                variables=self.variables,
            )