'Return a service, or None.
Services are objects implementing arbitrary other interfaces.  They are
requested by agreed-upon names, see [XXX TODO] for a list of possible
services.  The object returned depends on the service requested.
XBlocks must announce their intention to request services with the
`XBlock.needs` or `XBlock.wants` decorators.  Use `needs` if you assume
that the service is available, or `wants` if your code is flexible and
can accept a None from this method.
Runtimes can override this method if they have different techniques for
finding and delivering services.
Arguments:
block (an XBlock): this block\'s class will be examined for service
decorators.
service_name (string): the name of the service requested.
Returns:
An object implementing the requested service, or None.'

def service(self, block, service_name):

    service = None
    if self._module_system:
        service = self._module_system.service(block, service_name)
    if (service is None):
        service = self._descriptor_system.service(block, service_name)
    return service
