All very nice abstracted but horribly slow :(