public DateofBirthControl(ControlModel <DateTime?> model)
        {
            var dayName   = model.Name + "-" + "day";
            var monthName = model.Name + "-" + "month";
            var yearName  = model.Name + "-" + "year";

            model.AddRule("dob", "Please enter a valid date of birth.", RuleType.DataAttribute);

            var dayModel   = new ControlModel <int?>(dayName, dayName, model.Value?.Day, "Day", model.Rules, LabelOption.Hide);
            var monthModel = new ControlModel <string>(monthName, monthName, model.Value?.Month.ToString("D2"), "Month", model.Rules, LabelOption.Hide);
            var yearModel  = new ControlModel <int?>(yearName, yearName, model.Value?.Year, "Year", model.Rules, LabelOption.Hide);

            Inner = new ControlHolder().AddClass("js-dob")
                    .Append(new Label <DateTime?>(new ControlModel <DateTime?>(dayName, dayName, model.Value, model.DisplayName, model.Rules, model.LabelOption)))
                    .Append(new HtmlTag("div", tag => tag.AddClass("ctrls"))
                            .Append(new TextboxControl <int?>(dayModel, hideStatusMessage: true).Attribute("maxlength", "2").Placeholder("DD").AddClass("width-date-day").Inner)
                            .Append(new SelectControl <string>(monthModel, Months, hideStatusMessage: true).AddClass("width-date-month").Inner)
                            .Append(new TextboxControl <int?>(yearModel, hideStatusMessage: true).Attribute("maxlength", "4").Placeholder("YYYY").AddClass("width-date-year").Inner)
                            // hidden field gets populated by javaScript and is what is POSTED back
                            .Append(new HiddenTag().Name(model.Name).Id(model.Name).Data("dob-bind-value", "DD MMM YYYY").Value(model.Value?.ToString("dd MMM yyyy") ?? ""))
                            ).Append(new StatusMessage());
        }