Este tipo de problema es un campo tan minado de casos extremos que siempre delegaría la lógica en algo como IceCube (https://github.com/seejohnrun/ice_cube ). Está hecho para lidiar con este tipo de programaciones recurrentes y viene con soporte fácil para la serialización, etc. Incluso si requiere repensar un poco cómo haces las cosas, recomiendo enfáticamente usarlo.