'Returns a list of all the values for the given path in the object obj.
Given a path such as ["sub1", "sub2"] it returns all the values available
in obj.sub1.sub2 as a list. sub1 and sub2 must be data attributes or
properties.
If sub1 returns a list of objects, or a generator, Expand aggregates the
values for the remaining path for each of the objects, thus returning a
list of all the values under the given path for the input object.
Args:
obj: An object that will be traversed for the given path
path: A list of strings
Yields:
The values once the object is traversed.'

def Expand(self, obj, path):

    if isinstance(path, basestring):
        path = path.split(self.FIELD_SEPARATOR)
    attr_name = self._GetAttributeName(path)
    attr_value = self._GetValue(obj, attr_name)
    if (attr_value is None):
        return
    if (len(path) == 1):
        for value in self._AtLeaf(attr_value):
            (yield value)
    else:
        for value in self._AtNonLeaf(attr_value, path):
            (yield value)
