For validation and progress code is overly engineered and not easy to follow, dips into dynamic typing as well which is a bit messy.