\
    Returns an iterable of words from the provided text.
    
    `content`
        A text.
    `filter`
        Indicates if stop words and garbage like "xxxxxx" should be removed from
        the word list.
    `predicate`
        An alternative word filter. If it is ``None`` "xxxx", "---",
        default stop words, and words which have no min. length of 3 are filtered
        (iff ``filter`` is set to ``True``).
    
    >>> list(words('Hello and goodbye ------ '))
    ['Hello', 'goodbye']
    >>> list(words('Hello, and goodbye ------ Subject xxxxxxxxx XXXXXXXXXXXX here'))
    ['Hello', 'goodbye', 'Subject']
    >>> list(words('Hello, and goodbye.How are you?'))
    ['Hello', 'goodbye']

def words(content, filter=True, predicate=None):
    """\
    Returns an iterable of words from the provided text.
    
    `content`
        A text.
    `filter`
        Indicates if stop words and garbage like "xxxxxx" should be removed from
        the word list.
    `predicate`
        An alternative word filter. If it is ``None`` "xxxx", "---",
        default stop words, and words which have no min. length of 3 are filtered
        (iff ``filter`` is set to ``True``).
    
    >>> list(words('Hello and goodbye ------ '))
    ['Hello', 'goodbye']
    >>> list(words('Hello, and goodbye ------ Subject xxxxxxxxx XXXXXXXXXXXX here'))
    ['Hello', 'goodbye', 'Subject']
    >>> list(words('Hello, and goodbye.How are you?'))
    ['Hello', 'goodbye']
    """
    def accept_word(word):
        """\
        Returns if the `word` is acceptable/useful
        
        `word`
            The word to check.
        """
        return len(word) > 2 \
                and word.lower() not in stop_words \
                and not _UNWANTED_WORDS_PATTERN.match(word)
    words = _tokenize(content)
    if filter or predicate:
        if not predicate:
            predicate = accept_word
        return (w for w in words if predicate(w))
    return words