code: def inc(self, source, month=None, year=None):
          
          yr  = source.year
          mth = source.month
          dy  = source.day
  
          if year:
              try:
                  yi = int(year)
              except ValueError:
                  yi = 0
  
              yr += yi
  
          if month:
              try:
                  mi = int(month)
              except ValueError:
                  mi = 0
  
              m = abs(mi)
              y = m / 12      # how many years are in month increment
              m = m % 12      # get remaining months
  
              if mi < 0:
                  mth = mth - m           # sub months from start month
                  if mth < 1:             # cross start-of-year?
                      y   -= 1            #   yes - decrement year
                      mth += 12           #         and fix month
              else:
                  mth = mth + m           # add months to start month
                  if mth > 12:            # cross end-of-year?
                      y   += 1            #   yes - increment year
                      mth -= 12           #         and fix month
  
              yr += y
  
              # if the day ends up past the last day of
              # the new month, set it to the last day
              if dy > self.ptc.daysInMonth(mth, yr):
                  dy = self.ptc.daysInMonth(mth, yr)
  
          d = source.replace(year=yr, month=mth, day=dy)
  
          return source + (d - source)
docs: Takes the given C{source} date, or current date if none is
          passed, and increments it according to the values passed in
          by month and/or year.
  
          This routine is needed because Python's C{timedelta()} function
          does not allow for month or year increments.
  
          @type  source: struct_time
          @param source: C{struct_time} value to increment
          @type  month:  integer
          @param month:  optional number of months to increment
          @type  year:   integer
          @param year:   optional number of years to increment
  
          @rtype:  datetime
          @return: C{source} incremented by the number of months and/or years