Again, it feels a bit odd using shared pointers here.