def filter_events(events, version_label=None, request_id=None, env_name=None):
    """
    Method filters events by their version_label, request_id, or env_name if supplied,
    or any combination if multiple are specified.

    :param events: A list of `events` returned by the `DescribeEvents` API
    :param version_label: An optional `version_label` of the environment to filter by
    :param request_id: An optional `request_id` of the operation being waited on to filter by
    :param env_name: An optional `environment_name` of the environment that is being waited on
    :return: A new list of events filtered as per the rules above.
    """
    filtered_events = []
    for event in events:
        if (version_label and event.version_label and event.version_label !=
            version_label):
            continue
        if request_id and event.request_id and event.request_id != request_id:
            continue
        if (env_name and event.environment_name and event.environment_name !=
            env_name):
            continue
        filtered_events.append(event)
    return filtered_events
