I don't have time to check right now but couldn't this be simpler ?

- We should be using final where possible, see https://groups.google.com/a/dartlang.org/forum/#!topic/misc/qccnux8c6BE
- Do you really need to copy the map ? the may be Map.from
- Couldn't invoke be invoked with null / {} as a last arg ?