You're competing with named events. Lets see how they are nice. I.e. look, the mapping of the click event to the listener is 1 to 1, direct, easy to read.

```javascript
var events = {
    "log-click": function () {
        console.log("click")
    }
}

shapes.circle(state.p, state.c, {
    "data-click": "log-click"
})
```

The term `sink` is a pretty generic high level term that doesn't communicate anything., which could be part of the confusion with this.

Now we have the problem of associating data, again we can see the 1 to 1 mapping quite easily with a readable association.

```javascript
var events = {
    "log-click": function (ev, data) {
        console.log("click", ev, data)
    }
}

shapes.circle(state.p, state.c, {
    "data-click": clickEvent("log-click", { something: "special" })
})
```

Somehow I get the impression that the sources/sinks abstraction is pretty over-engineered. I might be wrong, but you should take from the fact that it is not simple to get on fist pass of reading, compared with what I have just demonstrated.