'Moves all stashes that match the filter_func from src to dst.
:returns: A new stashes dictionary.'

@staticmethod
def _move(stashes, filter_func, src, dst):

    if (dst == SimulationManager.ALL):
        raise SimulationManagerError("Can't    handle    '_ALL'    as    a    target    stash.")
    if (src == SimulationManager.DROP):
        raise SimulationManagerError("Can't    handle    '_DROP'    as    a    source    stash.")
    if (src == SimulationManager.ALL):
        srces = [a for a in stashes.keys() if (a != dst)]
    else:
        srces = [src]
    matches = []
    for f in srces:
        (to_move, to_keep) = SimulationManager._filter_states(filter_func, stashes[f])
        stashes[f] = to_keep
        matches.extend(to_move)
    if (dst != SimulationManager.DROP):
        if (dst not in stashes):
            stashes[dst] = []
        stashes[dst].extend(matches)
    return stashes
