The problem then is that this doesn't really replace a given pattern with a
desired output. If I want to add 1 to every add and I have cos(x + 1) + 1 I
should get cos(x+2) + 2. And if you are going to recursively look for
patterns going from top to bottom or from bottom up you are going to face
the problem of dealing with subexpressions. IMO using bottom up with a
custom function is better than using replace or xreplace to do this sort of
task because rather than using a pattern you use a specific query to see if
the pattern matches what you want:

```
def add1toAdd(e):
 def do(e):
  if e.is_Add: return e + 1
  return e
 return bottom_up(e, do)

>>> add1toAdd(cos(x+1)+1)
cos(x + 2) + 2
>>> t=Transform(lambda x:x+1, lambda x:x.is_Add)
>>> (cos(x+1)+1).xreplace(t)
cos(x + 1) + 2
>>> (cos(x+1)+1).replace(lambda x:x.is_Add, lambda x: x+1)
cos(x + 2) + 2
```

That last result was `cos(x+2) + 1` before this PR, I believe.