human
Complete this python program:
def make_skyoffset_cls(framecls):
assistant
#Here is the Python program you requested.

    """Create a new class that is the sky offset frame for a specific class of
    origin frame. If such a class has already been created for this frame, the
    same class will be returned.
    The new class will always have component names for spherical coordinates of
    ``lon``/``lat``.
    Parameters
    framecls : coordinate frame class (i.e., subclass of `~astropy.coordinates.BaseCoordinateFrame`)
    The class to create the SkyOffsetFrame of.
    Returns
    skyoffsetframecls : class
    The class for the new skyoffset frame.
    Notes
    This function is necessary because Astropy\s frame transformations depend
    on connection between specific frame *classes*.  So each type of frame
    needs its own distinct skyoffset frame class.  This function generates
    just that class, as well as ensuring that only one example of such a class
    actually gets created in any given python session.
    """
    if (framecls in _skyoffset_cache):
        return _skyoffset_cache[framecls]
    framemeta = framecls.__class__
    class SkyOffsetMeta(framemeta, ):
        '\n                                This    metaclass    renames    the    class    to    be    "SkyOffset<framecls>"    and    also\n                                adjusts    the    frame    specific    representation    info    so    that    spherical    names\n                                are    always    "lon"    and    "lat"    (instead    of    e.g.    "ra"    and    "dec").\n                                '
        def __new__(cls, name, bases, members):
            members['origin'] = CoordinateAttribute(frame=framecls, default=None)
            members['_frame_specific_representation_info'] = framecls._frame_specific_representation_info
            members['_default_representation'] = framecls._default_representation
            members['_default_differential'] = framecls._default_differential
            newname = (name[:(-5)] if name.endswith('Frame') else name)
            newname += framecls.__name__
            res = super(SkyOffsetMeta, cls).__new__(cls, newname, bases, members)
            lists_done = []
            for (cls_, component_list) in res._frame_specific_representation_info.items():
                if (cls_ in (r.SphericalRepresentation, r.UnitSphericalRepresentation)):
                    gotlatlon = []
                    for (i, comp) in enumerate(component_list):
                        if (component_list in lists_done):
                            continue
                        if (comp.reprname in ('lon', 'lat')):
                            dct = namedtuple_asdict(comp)
                            dct['framename'] = comp.reprname
                            component_list[i] = type(comp)(**dct)
                            gotlatlon.append(comp.reprname)
                    if ('lon' not in gotlatlon):
                        rmlon = RepresentationMapping('lon', 'lon', 'recommended')
                       ...