Generate a random date of birth represented as a Date object,
        constrained by optional miminimum_age and maximum_age
        parameters.

        :param tzinfo Defaults to None.
        :param minimum_age Defaults to 0.
        :param maximum_age Defaults to 115.

        :example Date('1979-02-02')
        :return Date

def date_of_birth(self, tzinfo=None, minimum_age=0, maximum_age=115):
        """
        Generate a random date of birth represented as a Date object,
        constrained by optional miminimum_age and maximum_age
        parameters.

        :param tzinfo Defaults to None.
        :param minimum_age Defaults to 0.
        :param maximum_age Defaults to 115.

        :example Date('1979-02-02')
        :return Date
        """

        if not isinstance(minimum_age, int):
            raise TypeError("minimum_age must be an integer.")

        if not isinstance(maximum_age, int):
            raise TypeError("maximum_age must be an integer.")

        if (maximum_age < 0):
            raise ValueError("maximum_age must be greater than or equal to zero.")

        if (minimum_age < 0):
            raise ValueError("minimum_age must be greater than or equal to zero.")

        if (minimum_age > maximum_age):
            raise ValueError("minimum_age must be less than or equal to maximum_age.")

        # In order to return the full range of possible dates of birth, add one
        # year to the potential age cap and subtract one day if we land on the
        # boundary.

        now = datetime.now(tzinfo).date()
        start_date = now.replace(year=now.year - (maximum_age+1))
        end_date = now.replace(year=now.year - minimum_age)

        dob = self.date_time_ad(tzinfo=tzinfo, start_datetime=start_date, end_datetime=end_date).date()

        return dob if dob != start_date else dob + timedelta(days=1)