def add_collection_errors(
        self,
        property_name,
        direct_errors=None,
        collection_errors=None
    ):
        if direct_errors is None and collection_errors is None:
            return self
        if direct_errors is not None:
            if type(direct_errors) is not list:
                direct_errors = [direct_errors]
            if property_name not in self.errors:
                self.errors[property_name] = dict()
            if 'direct' not in self.errors[property_name]:
                self.errors[property_name]['direct'] = []
            for error in direct_errors:
                if not isinstance(error, Error):
                    err = 'Error must be of type {}'
                    raise x.InvalidErrorType(err.format(Error))
                self.errors[property_name]['direct'].append(error)
        if collection_errors:
            enum = enumerate(collection_errors)
            errors_dict = {i: e for i, e in enum if not bool(e)}
            if not errors_dict:
                return self
            if property_name not in self.errors:
                self.errors[property_name] = dict()
            if 'collection' not in self.errors[property_name]:
                self.errors[property_name]['collection'] = errors_dict
            else:
                local = self.errors[property_name]['collection']
                remote = errors_dict
                for index, result in remote.items():
                    if index not in local:
                        self.errors[property_name]['collection'][index] = result
                    else:
                        merged = self.merge_errors(
                            local[index].errors,
                            remote[index].errors
                        )
                        self.errors[property_name]['collection'][index] = merged
        return self