Only thing that feels slightly off is not having url and target as named arguments here (burying them in a dict seems slightly confusing) but if there's a good reason for it then that's cool.