def METHOD_NAME(cls, prop_path, raise_on_error=True, log_on_error=True, default=None, data=None, log=None):
    obj = data
    props = prop_path.split('.')
    for i in range(len(props)):
        if not hasattr(obj, props[i]) and (not isinstance(obj, dict) or props[i] not in obj):
            msg = 'Task has no %s section defined' % '.'.join(props[:i + 1])
            if log_on_error and log:
                log.info(msg)
            if raise_on_error:
                raise ValueError(msg)
            return default
        if isinstance(obj, dict):
            obj = obj.get(props[i])
        else:
            obj = getattr(obj, props[i], None)
    return obj