'Find the provider of the property by I{name}.
@param name: The property name.
@type name: str
@param history: A history of nodes checked to prevent
circular hunting.
@type history: [L{Properties},..]
@return: The provider when found.  Otherwise, None (when nested)
and I{self} when not nested.
@rtype: L{Properties}'

def provider(self, name, history=None):

    if (history is None):
        history = []
    history.append(self)
    if (name in self.definitions):
        return self
    for x in self.links:
        if (x in history):
            continue
        provider = x.provider(name, history)
        if (provider is not None):
            return provider
    history.remove(self)
    if len(history):
        return None
    return self
