<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def joined_units(self):
 """ A list view of all the units joined on this relation. This is actually a :class:`~charms.reactive.endpoints.CombinedUnitsView`, so the units will be in order by unit name, and you can access a merged view of all of the units' data with ``self.units.received`` and ``self.units.received``. You should be very careful when using the merged data collections, however, and consider carefully what will happen when there are multiple remote units. It is probabaly better to iterate over each unit and handle its data individually. See :class:`~charms.reactive.endpoints.CombinedUnitsView` for an explanation of how the merged data collections work. The view can be iterated and indexed as a list, or you can look up units by their unit name. For example:: by_index = relation.units[0] by_name = relation.units['unit/0'] assert by_index is by_name assert all(unit is relation.units[unit.unit_name] for unit in relation.units) print(', '.join(relation.units.keys())) """

        if self._units is None:
            self._units = CombinedUnitsView([
                RelatedUnit(self, unit_name) for unit_name in
                sorted(hookenv.related_units(self.relation_id))
            ])
        return self._units