Returns the dict of model variables, as follows:

        --each getProperty() and isProperty() getter method
          is called, and a "property" key is added to the result

        --variables set via setVar() are added to the result,
          overwriting any value already provided by a getter

        The variables can be cached, to avoid further processing,
        by setting the related constructor parameter: in this case,
        findVars() returns a copy of the cached vars dictionary.

def findVars(self):
        """
        Returns the dict of model variables, as follows:

        --each getProperty() and isProperty() getter method
          is called, and a "property" key is added to the result

        --variables set via setVar() are added to the result,
          overwriting any value already provided by a getter

        The variables can be cached, to avoid further processing,
        by setting the related constructor parameter: in this case,
        findVars() returns a copy of the cached vars dictionary.
        """
        if self._cacheVars and (self._vars is not None):
            return dict(self._vars)

        result = {}

        for itemName in map(str, dir(self)):
            match = self._getterPattern.match(itemName)

            if match is None:
                continue

            propertyName = match.group(1)
            varName = propertyName[0].lower() + propertyName[1:]

            varValue = getattr(self, itemName)()

            result[varName] = varValue

        result.update(self._explicitVars)

        result["vars"] = result

        if self._cacheVars:
            self._vars = dict(result)

        return result