Step 1
Step 2
Step 3 (no refactoring necessary)
Step 4
Step 5
Step 6