# Specification ## Purpose and non-goals The common `DeviceProxy` is a factory for instantiating clients from multiple device classes, including classes implemented over different transport frameworks, in one process. It does not abstract transport, discover devices, maintain a database, manage connections, or implement dynamic method dispatch. It does not replace existing device-specific clients. ## Registration and construction `register_device_proxy(device_class: str, creator: Callable)` registers into one process-local registry. Empty, whitespace-padded, and duplicate names are rejected. Uniqueness is enforced **within this process**, not by scanning other processes or installed packages. `DeviceProxy(device_class, *args, **kwargs)` returns `creator(*args, **kwargs)` without interpreting `async_mode`, `config`, or transport. Unknown names raise `KeyError`. `get_device_proxy_entry` returns an entry, `list_device_proxies` returns sorted names, and `unregister_device_proxy` removes an entry (unknown names raise `KeyError`). `create_device_proxy` binds a device-class name and returns a callable; it does not provide static return typing. ## Optional async/sync helper `make_async_sync_factory(async_client_cls=..., sync_client_cls=..., default_async_mode=True)` creates a factory that interprets `async_mode=True/False/None`. `None` uses the configured default. Missing requested modes raise `ValueError` rather than silently falling back. Tango clients are not required to use this helper. ## Compatibility Python >=3.7, no runtime third-party dependencies. Existing transport frameworks retain responsibility for communication and client behavior. Their existing registries are not automatically merged.