Вариант с нуля с рефакторингом, нерабочий пока.