function buildDateUnitMethods() {

    defineInstanceSimilar(sugarDate, DateUnits, function(methods, unit, index) {
      var name = unit.name, caps = simpleCapitalize(name);

      if (index > DAY_INDEX) {
        forEach(['Last','This','Next'], function(shift) {
          methods['is' + shift + caps] = function(d, localeCode) {
            return compareDate(d, shift + ' ' + name, 0, localeCode, { locale: 'en' });
          };
        });
      }
      if (index > HOURS_INDEX) {
        methods['beginningOf' + caps] = function(d, localeCode) {
          return moveToBeginningOfUnit(d, index, localeCode);
        };
        methods['endOf' + caps] = function(d, localeCode) {
          return moveToEndOfUnit(d, index, localeCode);
        };
      }

      methods['add' + caps + 's'] = function(d, num, reset) {
        return advanceDate(d, name, num, reset);
      };

      var since = function(date, d, options) {
        return getTimeDistanceForUnit(date, createDate(d, options, true), unit);
      };
      var until = function(date, d, options) {
        return getTimeDistanceForUnit(createDate(d, options, true), date, unit);
      };

      methods[name + 'sAgo']   = methods[name + 'sUntil']   = until;
      methods[name + 'sSince'] = methods[name + 'sFromNow'] = since;

    });

  }
@method [units]Since(d, [options])
@returns Number
@short Returns the time since [d].
@extra [d] will accept a date object, timestamp, or string. If not specified,
       [d] is assumed to be now. `unitsAgo` is provided as an alias to make
       this more readable when [d] is assumed to be the current date.
       [options] can be an object or a locale code as a string. See `create`
       for more.

@set
  millisecondsSince
  secondsSince
  minutesSince
  hoursSince
  daysSince
  weeksSince
  monthsSince
  yearsSince

@example

  new Date().millisecondsSince('1 hour ago') -> 3,600,000
  new Date().daysSince('1 week ago')         -> 7
  new Date().yearsSince('15 years ago')      -> 15
  lastYear.yearsAgo()                 -> 1

@param {string|number|Date} d
@param {DateCreateOptions} options

**
@method [units]Ago()
@returns Number
@short Returns the time ago in the appropriate unit.

@set
  millisecondsAgo
  secondsAgo
  minutesAgo
  hoursAgo
  daysAgo
  weeksAgo
  monthsAgo
  yearsAgo

@example

  lastYear.millisecondsAgo() -> 3,600,000
  lastYear.daysAgo()         -> 7
  lastYear.yearsAgo()        -> 15

**
@method [units]Until([d], [options])
@returns Number
@short Returns the time until [d].
@extra [d] will accept a date object, timestamp, or string. If not specified,
       [d] is assumed to be now. `unitsFromNow` is provided as an alias to
       make this more readable when [d] is assumed to be the current date.
       [options] can be an object or a locale code as a string. See `create`
       for more.


@set
  millisecondsUntil
  secondsUntil
  minutesUntil
  hoursUntil
  daysUntil
  weeksUntil
  monthsUntil
  yearsUntil

@example

  new Date().millisecondsUntil('1 hour from now') -> 3,600,000
  new Date().daysUntil('1 week from now')         -> 7
  new Date().yearsUntil('15 years from now')      -> 15
  nextYear.yearsFromNow()                  -> 1

@param {string|number|Date} d
@param {DateCreateOptions} options

**
@method [units]FromNow()
@returns Number
@short Returns the time from now in the appropriate unit.

@set
  millisecondsFromNow
  secondsFromNow
  minutesFromNow
  hoursFromNow
  daysFromNow
  weeksFromNow
  monthsFromNow
  yearsFromNow

@example

  nextYear.millisecondsFromNow() -> 3,600,000
  nextYear.daysFromNow()         -> 7
  nextYear.yearsFromNow()        -> 15

**
@method add[Units](n, [reset] = false)
@returns Date
@short Adds `n` units to the date. If [reset] is true, all lower units will
       be reset.
@extra This method modifies the date! Note that in the case of `addMonths`,
       the date may fall on a date that doesn't exist (i.e. February 30). In
       this case the date will be shifted to the last day of the month. Don't
       use `addMonths` if you need precision.

@set
  addMilliseconds
  addSeconds
  addMinutes
  addHours
  addDays
  addWeeks
  addMonths
  addYears

@example

  new Date().addYears(5)        -> current time + 5 years
  new Date().addDays(5)         -> current time + 5 days
  new Date().addDays(5, true)   -> current time + 5 days (time reset)

@param {number} n
@param {boolean} [reset]

**
@method isLast[Unit]([localeCode])
@returns Boolean
@short Returns true if the date is last week, month, or year.
@extra This method takes an optional locale code for `isLastWeek`, which is
       locale dependent. The default locale code is `en`, which places
       Sunday at the beginning of the week. You can pass `en-GB` as a quick
       way to force Monday as the beginning of the week.

@set
  isLastWeek
  isLastMonth
  isLastYear

@example

  yesterday.isLastWeek()  -> true or false?
  yesterday.isLastMonth() -> probably not...
  yesterday.isLastYear()  -> even less likely...

@param {string} [localeCode]

**
@method isThis[Unit]([localeCode])
@returns Boolean
@short Returns true if the date is this week, month, or year.
@extra This method takes an optional locale code for `isThisWeek`, which is
       locale dependent. The default locale code is `en`, which places
       Sunday at the beginning of the week. You can pass `en-GB` as a quick
       way to force Monday as the beginning of the week.

@set
  isThisWeek
  isThisMonth
  isThisYear

@example

  tomorrow.isThisWeek()  -> true or false?
  tomorrow.isThisMonth() -> probably...
  tomorrow.isThisYear()  -> signs point to yes...

@param {string} [localeCode]

**
@method isNext[Unit]([localeCode])
@returns Boolean
@short Returns true if the date is next week, month, or year.
@extra This method takes an optional locale code for `isNextWeek`, which is
       locale dependent. The default locale code is `en`, which places
       Sunday at the beginning of the week. You can pass `en-GB` as a quick
       way to force Monday as the beginning of the week.

@set
  isNextWeek
  isNextMonth
  isNextYear

@example

  tomorrow.isNextWeek()  -> true or false?
  tomorrow.isNextMonth() -> probably not...
  tomorrow.isNextYear()  -> even less likely...

@param {string} [localeCode]

**
@method beginningOf[Unit]([localeCode])
@returns Date
@short Sets the date to the beginning of the appropriate unit.
@extra This method modifies the date! A locale code can be passed for
       `beginningOfWeek`, which is locale dependent. If consistency is
       needed, use `beginningOfISOWeek` instead.

@set
  beginningOfDay
  beginningOfWeek
  beginningOfMonth
  beginningOfYear

@example

  new Date().beginningOfDay()   -> the beginning of today (resets the time)
  new Date().beginningOfWeek()  -> the beginning of the week
  new Date().beginningOfMonth() -> the beginning of the month
  new Date().beginningOfYear()  -> the beginning of the year

@param {string} [localeCode]

**
@method endOf[Unit]([localeCode])
@returns Date
@short Sets the date to the end of the appropriate unit.
@extra This method modifies the date! A locale code can be passed for
       `endOfWeek`, which is locale dependent. If consistency is needed, use
       `endOfISOWeek` instead.

@set
  endOfDay
  endOfWeek
  endOfMonth
  endOfYear

@example

  new Date().endOfDay()   -> the end of today (sets the time to 23:59:59.999)
  new Date().endOfWeek()  -> the end of the week
  new Date().endOfMonth() -> the end of the month
  new Date().endOfYear()  -> the end of the year

@param {string} [localeCode]

*