def construct(namedtuple_, schema, **kwargs):
    """
    Construct a new namedtuple using ``namedtuple_`` and the attribute/value
    pairs in ``kwargs``. Use ``schema`` to validate the arguments. Return a
    "maybe namedtuple_", i.e., a 2-tuple where the second element is None in
    the happy path, but an error string in the failure case.
    """
    new_kwargs = {k: kwargs.get(k, schema[k].default) for
                  k in namedtuple_._fields}
    wrong_types = [
        (f'Value "{v}" of type "{type(v)}" is not of expected type'
         f' "{schema[k].type}" for attribute "{k}".') for
        k, v in new_kwargs.items() if
        not isinstance(v, schema[k].type)]
    if wrong_types:
        return None, ' '.join(sorted(wrong_types))
    validators = {
        k: schema[k].validator for
        k, v in new_kwargs.items() if schema[k].validator}
    validations = [
        validator(new_kwargs[k]) for k, validator in validators.items()]
    validation_failures = [err for _, err in validations if err]
    if validation_failures:
        return None, ' '.join(sorted(validation_failures))
    return namedtuple_(**new_kwargs), None