def add_validator(validator, base_tag, tag=None):
    """
    Add a validator for the given tag, which defines a subset of base_tag.
    If tag is None, it is automatically constructed as
    u'!~' + validator.__name__
    Validator is a function that accepts a document node (in the form of a
    Python object), a schema node (also a Python object) and a tracing
    object, and returns True if the document node is valid according to the
    schema node.  Note that the validator function does not have to recurse
    in sub-nodes, because XYS already does it.
    """
    if not tag:
        tag = u'!~' + validator.__name__

    for xid, opts in _VALIDATOR_MODES.iteritems():
        mtag = "%s%s" % (tag, xid)

        yaml.add_constructor(mtag,
                             ContructorValidatorNode(mtag,
                                                     base_tag,
                                                     validator,
                                                     opts['name'],
                                                     opts['min'],
                                                     opts['max']))