Добавлен пример с рефакторингом.
Первая версия после рефакторинга.
Вторая версия.
Версия 3.