Merged everything in one 'factory' method