public Names inflectTo(Names names, Case $case) {
        Gender gender =
            names.gender == null
                ? Gender.detect(names.middleName)
                : names.gender;

        CaseInflection inflection = new CaseInflection(this.provider, gender);

        return new Names(
            inflection.inflectLastNameTo(names.lastName, $case),
            inflection.inflectFirstNameTo(names.firstName, $case),
            names.middleName == null
                ? null
                : inflection.inflectMiddleNameTo(names.middleName, $case),
            gender
        );
    }