Arch

Wow. :o 

please split it up and add a comment, why you return a unique pointer instead of a shared pointer