public ActionResult Register(RegistrationViewModel registrationViewModel)
 {
     return RegisterInternal(registrationViewModel, "Sorry, that email address has already been registered.",
         createUser: (pwd) => new Parent(registrationViewModel.Name, registrationViewModel.Email, pwd).Initialise(),
         confirmAction: () => RedirectToAction("Confirm"),
         invalidModelStateAction: () => View("Register", registrationViewModel)
         );
 }
        ActionResult RegisterInternal(
            RegistrationViewModel registrationViewModel,
            string usernameTakenMessage,
            Func<string, User> createUser,
            Func<ActionResult> confirmAction, 
            Func<ActionResult> invalidModelStateAction,
            Action<User> afterUserCreated = null)
        {
            if (registrationViewModel == null)
            {
                throw new ArgumentNullException("registrationViewModel");
            }
            if (createUser == null)
            {
                throw new ArgumentNullException("createUser");
            }
            if (confirmAction == null)
            {
                throw new ArgumentNullException("confirmAction");
            }
            if (invalidModelStateAction == null)
            {
                throw new ArgumentNullException("invalidModelStateAction");
            }

            if (ModelState.IsValid)
            {
                var conflictedUser = userService.GetUserByUserName(registrationViewModel.Email);
                if (conflictedUser != null)
                {
                    ModelState.AddModelError("Email", usernameTakenMessage);
                    return invalidModelStateAction();
                }

                var hashedPassword = formsAuthenticationService.HashAndSalt(
                    registrationViewModel.Email,
                    registrationViewModel.Password);

                var user = createUser(hashedPassword);

                userService.SaveUser(user);

                if (afterUserCreated != null)
                {
                    afterUserCreated(user);
                }
                return confirmAction();
            }

            return invalidModelStateAction();
        }
        public ActionResult AddChild(RegistrationViewModel registrationViewModel)
        {
            var parent = userService.CurrentUser as Parent;
            if(parent == null)
            {
                //throw new TardisBankException("You must be a parent in order to register a Child");
                return StatusCode.NotFound;
            }

            return RegisterInternal(registrationViewModel, "Sorry, that user name has already been taken",
                createUser: (pwd) => parent.CreateChild(registrationViewModel.Name, registrationViewModel.Email, pwd),
                confirmAction: () => RedirectToAction("Index", "Child"),
                invalidModelStateAction: () => View("AddChild", registrationViewModel)
                );
        }