def METHOD_NAME(self, track, track_type, context):
    """Describe track to a dict.
    :param track:
    :param track_type:
    :rtype: dict
    """
    props = {}
    pv_props = {}
    for name, prop in self.mapping[track_type].items():
        if not prop:
            # placeholder to be populated by rules. It keeps the order
            props[name] = None
            continue
        value = prop.extract_value(track, context)
        if value is not None:
            which = props if not prop.private else pv_props
            which[name] = value
    for name, rule in self.rules.get(track_type, {}).items():
        if props.get(name) is not None and not rule.override:
            logger.debug('Skipping rule %s since property is already present: %r', name, props[name])
            continue
        value = rule.execute(props, pv_props, context)
        if value is not None:
            which = props if not rule.private else pv_props
            which[name] = value
        elif name in props and (not rule.override or props[name] is None):
            del props[name]
    return props