<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def visibility(cls, orb, **kwargs):
 """Visibility from a topocentric frame see :py:meth:`Propagator.iter() <beyond.propagators.base.Propagator.iter>` for description of arguments handling. Args: orb (Orbit):
 Orbit to compute visibility from the station with Keyword Args: start (Date):
 starting date of the visibility search stop (Date or datetime.timedelta) end of the visibility search step (datetime.timedelta):
 step of the computation events (bool, Listener or list):
 If evaluate to True, compute AOS, LOS and MAX elevation for each pass on this station. If 'events' is a Listener or an iterable of Listeners, they will be added to the computation Any other keyword arguments are passed to the propagator. Yield: Orbit: In-visibility point of the orbit. This Orbit is already in the frame of the station and in spherical form. """


        from ..orbits.listeners import stations_listeners, Listener

        listeners = kwargs.setdefault('listeners', [])
        events = kwargs.pop('events', None)
        event_classes = tuple()

        if events:
            # Handling of the listeners passed in the 'events' kwarg
            # and merging them with the `listeners` kwarg
            if isinstance(events, Listener):
                listeners.append(events)
            elif isinstance(events, (list, tuple)):
                listeners.extend(events)

            sta_list = stations_listeners(cls)
            listeners.extend(sta_list)

            # Only the events present in the `event_classes` list will be yielded
            # outside of visibility. This list was created in order to force
            # the yield of AOS and LOS.

            event_classes = tuple(listener.event for listener in sta_list)

        for point in orb.iter(**kwargs):
            point.frame = cls
            point.form = 'spherical'

            # Not very clean !
            if point.phi < 0 and not isinstance(point.event, event_classes):
                continue

            yield point