'Use different min/max values depending on value type
(datetime with timezone, datetime or date).'

def __call__(self, value):

    if (not isinstance(value, self.types)):
        return True
    if (hasattr(value, 'tzinfo') and value.tzinfo):
        return (self.min_tz <= value <= self.max_tz)
    elif isinstance(value, datetime):
        return (self.min <= value <= self.max)
    else:
        return (self.min_date <= value <= self.max_date)
