def METHOD_NAME( self, aService ):
    """Generate and add proxy for specified service"""
    # The proxy code is auto-generated (from the service XML) and then
    # imported and added as a class attribute to the device. Named as
    # 'DomainService'. All ohNet proxy actions and properties are
    # accessible via these attributes
    #
    # TestBasic service   -> device.testBasic
    # AVTransport service -> device.aVTRansport
    attrName  = aService['domain'] + aService['name']
    proxyName = 'CpProxy%s%s%s' % \
        (aService['domain'], aService['name'][0].upper() + aService['name'][1:], aService['version'])
    # generate the proxy from the service XML
    serviceXml = urlopen( aService['url'] ).read()  # <<<<<<<<<==================================== This is failure point in discovery
                                                    # we get list of services back from ohnet, but fail to open URL for FIRST service
                                                    # so cannot create proxy (and everything eventually times out). No idea why - most
                                                    # likely product doesn't respond for whatever reason. Pissing around with delays
                                                    # doesn't seem to help much (adding prints did a bit, so some delays somewhere will
                                                    # probably reduce this) 
    proxy = GenProxy.GenProxy( aService['type'], serviceXml )
    # 'import' the generated proxies
    # we always rebuild the module with the most recently read service
    # definition, as service implementation details can vary between
    # different implementations of the same same services. More efficient
    # to only build module on first request and re-use it, but this DOES
    # give issues in case described above
    if proxyName in sys.modules.keys():
        proxyModule = sys.modules[proxyName]
    else:
        proxyModule = types.ModuleType( proxyName )
        sys.modules[proxyName] = proxyModule
    exec( proxy.text, proxyModule.__dict__ )
    # # FOR DEBUG - write generated proxies to, and import from file
    # #             NOTE - no mutex protection on file access, so do NOT use this
    # #                    technique except when debugging is necessary
    # import os
    # head, tail = os.path.split( os.path.dirname( __file__ ))
    # proxyDir = os.path.join( head, '.GeneratedProxies' )
    # if not os.path.exists( proxyDir ):
    #     os.mkdir( proxyDir )
    # if proxyDir not in sys.path:
    #     sys.path.append( proxyDir )
    # proxyPath = os.path.join( proxyDir, proxyName + '.py' )
    # proxy.Write( proxyPath )
    # exec( 'import %s as proxyModule' % proxyName )
    # add to list of available proxies
    setattr( self, attrName, eval( 'proxyModule.%s( self )' % proxyName ))
    self.proxies.append( attrName )