'This is the key routine that actually does time scale conversions.
This is not public and not connected to the read-only scale property.'

def _set_scale(self, scale):

    if (scale == self.scale):
        return
    if (scale not in self.SCALES):
        raise ValueError(u'Scale    {0!r}    is    not    in    the    allowed    scales    {1}'.format(scale, sorted(self.SCALES)))
    xform = (self.scale, scale)
    xform_sort = tuple(sorted(xform))
    multi = MULTI_HOPS.get(xform_sort, ())
    xforms = ((xform_sort[:1] + multi) + xform_sort[(-1):])
    if (xform_sort != xform):
        xforms = tuple(reversed(xforms))
    (jd1, jd2) = (self._time.jd1, self._time.jd2)
    for (sys1, sys2) in zip(xforms[:(-1)], xforms[1:]):
        args = [jd1, jd2]
        for sys12 in ((sys1, sys2), (sys2, sys1)):
            dt_method = u'_get_delta_{0}_{1}'.format(*sys12)
            try:
                get_dt = getattr(self, dt_method)
            except AttributeError:
                pass
            else:
                args.append(get_dt(jd1, jd2))
                break
        conv_func = getattr(erfa, (sys1 + sys2))
        (jd1, jd2) = conv_func(*args)
    self._time = self.FORMATS[self.format](jd1, jd2, scale, self.precision, self.in_subfmt, self.out_subfmt, from_jd=True)
