initial commit
authorSebastian Brix <sebastian.brix@graph-it.com>
Mon, 22 Jan 2018 11:31:56 +0000 (12:31 +0100)
committerswassen <swassen@pc17.castle>
Tue, 24 Apr 2018 14:23:37 +0000 (16:23 +0200)
27 files changed:
.gitignore [new file with mode: 0644]
Makefile [new file with mode: 0644]
Pipfile [new file with mode: 0644]
Pipfile.lock [new file with mode: 0644]
clock-test.py [new file with mode: 0755]
doc-pdoc/css.mako [new file with mode: 0644]
doc-pdoc/html.mako [new file with mode: 0644]
doc-pdoc/text.mako [new file with mode: 0644]
doc/clone.m.md [new file with mode: 0644]
doc/core.m.md [new file with mode: 0644]
doc/index.md [new file with mode: 0644]
doc/intf.m.md [new file with mode: 0644]
doc/keyed.m.md [new file with mode: 0644]
doc/store.m.md [new file with mode: 0644]
doc/switch.m.md [new file with mode: 0644]
doc/util.m.md [new file with mode: 0644]
listen.py [new file with mode: 0755]
setup.py [new file with mode: 0644]
supcon/__init__.py [new file with mode: 0644]
supcon/clone.py [new file with mode: 0644]
supcon/core.py [new file with mode: 0644]
supcon/graph.py [new file with mode: 0644]
supcon/intf.py [new file with mode: 0644]
supcon/keyed.py [new file with mode: 0644]
supcon/store.py [new file with mode: 0644]
supcon/switch.py [new file with mode: 0644]
supcon/util.py [new file with mode: 0644]

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..e07a6e8
--- /dev/null
@@ -0,0 +1,2 @@
+.directory
+__pycache__
diff --git a/Makefile b/Makefile
new file mode 100644 (file)
index 0000000..ca6f291
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,6 @@
+doku:
+       rm -rf ./doc/*
+       PYTHONPATH=. pipenv run pdoc --template-dir doc-pdoc --html --html-dir ./doc --all-submodules supcon
+       mv ./doc/supcon/* ./doc/
+       rm -rf ./doc/supcon
+       for f in ./doc/*.html; do mv $${f} `dirname $${f}`/`basename $${f} html`md; done 
diff --git a/Pipfile b/Pipfile
new file mode 100644 (file)
index 0000000..89d61f2
--- /dev/null
+++ b/Pipfile
@@ -0,0 +1,13 @@
+[[source]]
+url = "https://pypi.python.org/simple"
+verify_ssl = true
+name = "pypi"
+
+[packages]
+"e1839a8" = {path = ".", editable = true}
+
+[dev-packages]
+"e1839a8" = {path = ".", extras = ["e"], editable = true}
+
+[requires]
+python_version = "3"
diff --git a/Pipfile.lock b/Pipfile.lock
new file mode 100644 (file)
index 0000000..203345b
--- /dev/null
@@ -0,0 +1,430 @@
+{
+    "_meta": {
+        "hash": {
+            "sha256": "5222cbe0571531c1844f56e5766605155e243efab356f8b635f0ad9956893afa"
+        },
+        "pipfile-spec": 6,
+        "requires": {
+            "python_version": "3"
+        },
+        "sources": [
+            {
+                "name": "pypi",
+                "url": "https://pypi.python.org/simple",
+                "verify_ssl": true
+            }
+        ]
+    },
+    "default": {
+        "asn1crypto": {
+            "hashes": [
+                "sha256:2f1adbb7546ed199e3c90ef23ec95c5cf3585bac7d11fb7eb562a3fe89c64e87",
+                "sha256:9d5c20441baf0cb60a4ac34cc447c6c189024b6b4c6cd7877034f4965c464e49"
+            ],
+            "version": "==0.24.0"
+        },
+        "attrs": {
+            "hashes": [
+                "sha256:1c7960ccfd6a005cd9f7ba884e6316b5e430a3f1a6c37c5f87d8b43f83b54ec9",
+                "sha256:a17a9573a6f475c99b551c0e0a812707ddda1ec9653bed04c13841404ed6f450"
+            ],
+            "version": "==17.4.0"
+        },
+        "automat": {
+            "hashes": [
+                "sha256:2140297df155f7990f6f4c73b2ab0583bd8150db9ed2a1b48122abe66e9908c1",
+                "sha256:3c1fd04ecf08ac87b4dd3feae409542e9bf7827257097b2b6ed5692f69d6f6a8"
+            ],
+            "version": "==0.6.0"
+        },
+        "cffi": {
+            "hashes": [
+                "sha256:151b7eefd035c56b2b2e1eb9963c90c6302dc15fbd8c1c0a83a163ff2c7d7743",
+                "sha256:1553d1e99f035ace1c0544050622b7bc963374a00c467edafac50ad7bd276aef",
+                "sha256:1b0493c091a1898f1136e3f4f991a784437fac3673780ff9de3bcf46c80b6b50",
+                "sha256:2ba8a45822b7aee805ab49abfe7eec16b90587f7f26df20c71dd89e45a97076f",
+                "sha256:3c85641778460581c42924384f5e68076d724ceac0f267d66c757f7535069c93",
+                "sha256:3eb6434197633b7748cea30bf0ba9f66727cdce45117a712b29a443943733257",
+                "sha256:4c91af6e967c2015729d3e69c2e51d92f9898c330d6a851bf8f121236f3defd3",
+                "sha256:770f3782b31f50b68627e22f91cb182c48c47c02eb405fd689472aa7b7aa16dc",
+                "sha256:79f9b6f7c46ae1f8ded75f68cf8ad50e5729ed4d590c74840471fc2823457d04",
+                "sha256:7a33145e04d44ce95bcd71e522b478d282ad0eafaf34fe1ec5bbd73e662f22b6",
+                "sha256:857959354ae3a6fa3da6651b966d13b0a8bed6bbc87a0de7b38a549db1d2a359",
+                "sha256:87f37fe5130574ff76c17cab61e7d2538a16f843bb7bca8ebbc4b12de3078596",
+                "sha256:95d5251e4b5ca00061f9d9f3d6fe537247e145a8524ae9fd30a2f8fbce993b5b",
+                "sha256:9d1d3e63a4afdc29bd76ce6aa9d58c771cd1599fbba8cf5057e7860b203710dd",
+                "sha256:a36c5c154f9d42ec176e6e620cb0dd275744aa1d804786a71ac37dc3661a5e95",
+                "sha256:ae5e35a2c189d397b91034642cb0eab0e346f776ec2eb44a49a459e6615d6e2e",
+                "sha256:b0f7d4a3df8f06cf49f9f121bead236e328074de6449866515cea4907bbc63d6",
+                "sha256:b75110fb114fa366b29a027d0c9be3709579602ae111ff61674d28c93606acca",
+                "sha256:ba5e697569f84b13640c9e193170e89c13c6244c24400fc57e88724ef610cd31",
+                "sha256:be2a9b390f77fd7676d80bc3cdc4f8edb940d8c198ed2d8c0be1319018c778e1",
+                "sha256:d5d8555d9bfc3f02385c1c37e9f998e2011f0db4f90e250e5bc0c0a85a813085",
+                "sha256:e55e22ac0a30023426564b1059b035973ec82186ddddbac867078435801c7801",
+                "sha256:e90f17980e6ab0f3c2f3730e56d1fe9bcba1891eeea58966e89d352492cc74f4",
+                "sha256:ecbb7b01409e9b782df5ded849c178a0aa7c906cf8c5a67368047daab282b184",
+                "sha256:ed01918d545a38998bfa5902c7c00e0fee90e957ce036a4000a88e3fe2264917",
+                "sha256:edabd457cd23a02965166026fd9bfd196f4324fe6032e866d0f3bd0301cd486f",
+                "sha256:fdf1c1dc5bafc32bc5d08b054f94d659422b05aba244d6be4ddc1c72d9aa70fb"
+            ],
+            "markers": "platform_python_implementation != 'pypy'",
+            "version": "==1.11.5"
+        },
+        "constantly": {
+            "hashes": [
+                "sha256:586372eb92059873e29eba4f9dec8381541b4d3834660707faf8ba59146dfc35",
+                "sha256:dd2fa9d6b1a51a83f0d7dd76293d734046aa176e384bf6e33b7e44880eb37c5d"
+            ],
+            "version": "==15.1.0"
+        },
+        "cryptography": {
+            "hashes": [
+                "sha256:3f3b65d5a16e6b52fba63dc860b62ca9832f51f1a2ae5083c78b6840275f12dd",
+                "sha256:551a3abfe0c8c6833df4192a63371aa2ff43afd8f570ed345d31f251d78e7e04",
+                "sha256:5cb990056b7cadcca26813311187ad751ea644712022a3976443691168781b6f",
+                "sha256:60bda7f12ecb828358be53095fc9c6edda7de8f1ef571f96c00b2363643fa3cd",
+                "sha256:6fef51ec447fe9f8351894024e94736862900d3a9aa2961528e602eb65c92bdb",
+                "sha256:77d0ad229d47a6e0272d00f6bf8ac06ce14715a9fd02c9a97f5a2869aab3ccb2",
+                "sha256:808fe471b1a6b777f026f7dc7bd9a4959da4bfab64972f2bbe91e22527c1c037",
+                "sha256:9b62fb4d18529c84b961efd9187fecbb48e89aa1a0f9f4161c61b7fc42a101bd",
+                "sha256:9e5bed45ec6b4f828866ac6a6bedf08388ffcfa68abe9e94b34bb40977aba531",
+                "sha256:9fc295bf69130a342e7a19a39d7bbeb15c0bcaabc7382ec33ef3b2b7d18d2f63",
+                "sha256:abd070b5849ed64e6d349199bef955ee0ad99aefbad792f0c587f8effa681a5e",
+                "sha256:ba6a774749b6e510cffc2fb98535f717e0e5fd91c7c99a61d223293df79ab351",
+                "sha256:c332118647f084c983c6a3e1dba0f3bcb051f69d12baccac68db8d62d177eb8a",
+                "sha256:d6f46e862ee36df81e6342c2177ba84e70f722d9dc9c6c394f9f1f434c4a5563",
+                "sha256:db6013746f73bf8edd9c3d1d3f94db635b9422f503db3fc5ef105233d4c011ab",
+                "sha256:f57008eaff597c69cf692c3518f6d4800f0309253bb138b526a37fe9ef0c7471",
+                "sha256:f6c821ac253c19f2ad4c8691633ae1d1a17f120d5b01ea1d256d7b602bc59887"
+            ],
+            "version": "==2.2.2"
+        },
+        "e1839a8": {
+            "editable": true,
+            "path": "."
+        },
+        "hyperlink": {
+            "hashes": [
+                "sha256:98da4218a56b448c7ec7d2655cb339af1f7d751cf541469bb4fc28c4a4245b34",
+                "sha256:f01b4ff744f14bc5d0a22a6b9f1525ab7d6312cb0ff967f59414bbac52f0a306"
+            ],
+            "version": "==18.0.0"
+        },
+        "idna": {
+            "hashes": [
+                "sha256:2c6a5de3089009e3da7c5dde64a141dbc8551d5b7f6cf4ed7c2568d0cc520a8f",
+                "sha256:8c7309c718f94b3a625cb648ace320157ad16ff131ae0af362c9f21b80ef6ec4"
+            ],
+            "version": "==2.6"
+        },
+        "incremental": {
+            "hashes": [
+                "sha256:717e12246dddf231a349175f48d74d93e2897244939173b01974ab6661406b9f",
+                "sha256:7b751696aaf36eebfab537e458929e194460051ccad279c72b755a167eebd4b3"
+            ],
+            "version": "==17.5.0"
+        },
+        "msgpack-python": {
+            "hashes": [
+                "sha256:378cc8a6d3545b532dfd149da715abae4fda2a3adb6d74e525d0d5e51f46909b"
+            ],
+            "version": "==0.5.6"
+        },
+        "pigpio": {
+            "hashes": [
+                "sha256:38bdc1b4d58898e7b4a69de3b0d90e8e8ccd851ac7d03e30791769475ffd941f",
+                "sha256:be1480aecf7c8aba9c92d2846ae153ad4c7e89ae188b28e4bcc579c3bc30e36b"
+            ],
+            "version": "==1.40.post1"
+        },
+        "pyasn1": {
+            "hashes": [
+                "sha256:0d7f6e959fe53f3960a23d73f35e1fce61348b30915b6664309ca756de7c1f89",
+                "sha256:5a0db897b311d265cde49615cf783f1c78613138605cdd0f907ecfa5b2aba3ee",
+                "sha256:758cb50abddc03e4563fd9e7f03db56e3e87b58c0bd01247360326e5c0c7ffa5",
+                "sha256:7d626683e3d792cccc608da02498aff37ab4f3dafd8905d6bf755d11f9b26b43",
+                "sha256:a7efe807c4b83a859e2735c692b92ed7b567cfddc4163763412920041d876c2b",
+                "sha256:b5a9ca48055b9a20f6d1b3d68e38692e5431c86a0f99ea602e61294e891fee5b",
+                "sha256:c07d6e587b2f928366b1f67c09bda026a3e6fcc99e80a744dc67f8fca3895626",
+                "sha256:d258b0a71994f7770599835249cece1caef3c70def868c4915e6e5ca49b67d15",
+                "sha256:d5cd6ed995dba16fad0c521cfe31cd2d68400b53fcc2bce93326829be73ab6d1",
+                "sha256:d84c2aea3cf43780e9e6a19f4e4dddee9f6976519020e64e47c57e5c7a8c3dd2",
+                "sha256:e85895087905c65b5b594eb91f7522664c85545b147d5f4d4e7b1b07da8dcbdc",
+                "sha256:f81c96761fca60d64b1c9b79ec2e40cf9495a745cf570613079ef324aeb9672b"
+            ],
+            "version": "==0.4.2"
+        },
+        "pyasn1-modules": {
+            "hashes": [
+                "sha256:041e9fbafac548d095f5b6c3b328b80792f006196e15a232b731a83c93d59493",
+                "sha256:0cdca76a68dcb701fff58c397de0ef9922b472b1cb3ea9695ca19d03f1869787",
+                "sha256:0cea139045c38f84abaa803bcb4b5e8775ea12a42af10019d942f227acc426c3",
+                "sha256:0f2e50d20bc670be170966638fa0ae603f0bc9ed6ebe8e97a6d1d4cef30cc889",
+                "sha256:47fb6757ab78fe966e7c58b2030b546854f78416d653163f0ce9290cf2278e8b",
+                "sha256:598a6004ec26a8ab40a39ea955068cf2a3949ad9c0030da970f2e1ca4c9f1cc9",
+                "sha256:72fd8b0c11191da088147c6e4678ec53e573923ecf60b57eeac9e97433e09fc2",
+                "sha256:854700bbdd01394e2ada9c1bfbd0ed9f5d0c551350dbbd023e88b11d2771ae06",
+                "sha256:af00ea8f2022b6287dc375b2c70f31ab5af83989fc6fe9eacd4976ce26cd7ccc",
+                "sha256:b1f395cae2d669e0830cb023aa86f9f283b7a9aa32317d7f80d8e78aa2745812",
+                "sha256:c6747146e95d2b14cc2a8399b2b0bde3f93778f8f9ec704690d2b589c376c137",
+                "sha256:f53fe5bcebdf318f51399b250fe8325ef3a26d927f012cc0c8e0f9e9af7f9deb"
+            ],
+            "version": "==0.2.1"
+        },
+        "pycparser": {
+            "hashes": [
+                "sha256:99a8ca03e29851d96616ad0404b4aad7d9ee16f25c9f9708a11faf2810f7b226"
+            ],
+            "version": "==2.18"
+        },
+        "pyopenssl": {
+            "hashes": [
+                "sha256:07a2de1a54de07448732a81e38a55df7da109b2f47f599f8bb35b0cbec69d4bd",
+                "sha256:2c10cfba46a52c0b0950118981d61e72c1e5b1aac451ca1bc77de1a679456773"
+            ],
+            "version": "==17.5.0"
+        },
+        "service-identity": {
+            "hashes": [
+                "sha256:0e76f3c042cc0f5c7e6da002cf646f59dc4023962d1d1166343ce53bdad39e17",
+                "sha256:4001fbb3da19e0df22c47a06d29681a398473af4aa9d745eca525b3b2c2302ab"
+            ],
+            "version": "==17.0.0"
+        },
+        "six": {
+            "hashes": [
+                "sha256:70e8a77beed4562e7f14fe23a786b54f6296e34344c23bc42f07b15018ff98e9",
+                "sha256:832dc0e10feb1aa2c68dcc57dbb658f1c7e65b9b61af69048abc87a2db00a0eb"
+            ],
+            "version": "==1.11.0"
+        },
+        "twisted": {
+            "hashes": [
+                "sha256:0da1a7e35d5fcae37bc9c7978970b5feb3bc82822155b8654ec63925c05af75c",
+                "sha256:716805e624f9396fcc1f47e8aef68e629fd31599a74855b6e1636122c042458d",
+                "sha256:7bc3cdfd1ca5e5b84c7936db3c2cb2feb7d5b77410e713fd346da095a3b6a1d2"
+            ],
+            "version": "==17.9.0"
+        },
+        "zope.interface": {
+            "hashes": [
+                "sha256:21506674d30c009271fe68a242d330c83b1b9d76d62d03d87e1e9528c61beea6",
+                "sha256:3d184aff0756c44fff7de69eb4cd5b5311b6f452d4de28cb08343b3f21993763",
+                "sha256:467d364b24cb398f76ad5e90398d71b9325eb4232be9e8a50d6a3b3c7a1c8789",
+                "sha256:57c38470d9f57e37afb460c399eb254e7193ac7fb8042bd09bdc001981a9c74c",
+                "sha256:9ada83f4384bbb12dedc152bcdd46a3ac9f5f7720d43ac3ce3e8e8b91d733c10",
+                "sha256:a1daf9c5120f3cc6f2b5fef8e1d2a3fb7bbbb20ed4bfdc25bc8364bc62dcf54b",
+                "sha256:e6b77ae84f2b8502d99a7855fa33334a1eb6159de45626905cb3e454c023f339",
+                "sha256:e881ef610ff48aece2f4ee2af03d2db1a146dc7c705561bd6089b2356f61641f",
+                "sha256:f41037260deaacb875db250021fe883bf536bf6414a4fd25b25059b02e31b120"
+            ],
+            "version": "==4.5.0"
+        }
+    },
+    "develop": {
+        "asn1crypto": {
+            "hashes": [
+                "sha256:2f1adbb7546ed199e3c90ef23ec95c5cf3585bac7d11fb7eb562a3fe89c64e87",
+                "sha256:9d5c20441baf0cb60a4ac34cc447c6c189024b6b4c6cd7877034f4965c464e49"
+            ],
+            "version": "==0.24.0"
+        },
+        "attrs": {
+            "hashes": [
+                "sha256:1c7960ccfd6a005cd9f7ba884e6316b5e430a3f1a6c37c5f87d8b43f83b54ec9",
+                "sha256:a17a9573a6f475c99b551c0e0a812707ddda1ec9653bed04c13841404ed6f450"
+            ],
+            "version": "==17.4.0"
+        },
+        "automat": {
+            "hashes": [
+                "sha256:2140297df155f7990f6f4c73b2ab0583bd8150db9ed2a1b48122abe66e9908c1",
+                "sha256:3c1fd04ecf08ac87b4dd3feae409542e9bf7827257097b2b6ed5692f69d6f6a8"
+            ],
+            "version": "==0.6.0"
+        },
+        "cffi": {
+            "hashes": [
+                "sha256:151b7eefd035c56b2b2e1eb9963c90c6302dc15fbd8c1c0a83a163ff2c7d7743",
+                "sha256:1553d1e99f035ace1c0544050622b7bc963374a00c467edafac50ad7bd276aef",
+                "sha256:1b0493c091a1898f1136e3f4f991a784437fac3673780ff9de3bcf46c80b6b50",
+                "sha256:2ba8a45822b7aee805ab49abfe7eec16b90587f7f26df20c71dd89e45a97076f",
+                "sha256:3c85641778460581c42924384f5e68076d724ceac0f267d66c757f7535069c93",
+                "sha256:3eb6434197633b7748cea30bf0ba9f66727cdce45117a712b29a443943733257",
+                "sha256:4c91af6e967c2015729d3e69c2e51d92f9898c330d6a851bf8f121236f3defd3",
+                "sha256:770f3782b31f50b68627e22f91cb182c48c47c02eb405fd689472aa7b7aa16dc",
+                "sha256:79f9b6f7c46ae1f8ded75f68cf8ad50e5729ed4d590c74840471fc2823457d04",
+                "sha256:7a33145e04d44ce95bcd71e522b478d282ad0eafaf34fe1ec5bbd73e662f22b6",
+                "sha256:857959354ae3a6fa3da6651b966d13b0a8bed6bbc87a0de7b38a549db1d2a359",
+                "sha256:87f37fe5130574ff76c17cab61e7d2538a16f843bb7bca8ebbc4b12de3078596",
+                "sha256:95d5251e4b5ca00061f9d9f3d6fe537247e145a8524ae9fd30a2f8fbce993b5b",
+                "sha256:9d1d3e63a4afdc29bd76ce6aa9d58c771cd1599fbba8cf5057e7860b203710dd",
+                "sha256:a36c5c154f9d42ec176e6e620cb0dd275744aa1d804786a71ac37dc3661a5e95",
+                "sha256:ae5e35a2c189d397b91034642cb0eab0e346f776ec2eb44a49a459e6615d6e2e",
+                "sha256:b0f7d4a3df8f06cf49f9f121bead236e328074de6449866515cea4907bbc63d6",
+                "sha256:b75110fb114fa366b29a027d0c9be3709579602ae111ff61674d28c93606acca",
+                "sha256:ba5e697569f84b13640c9e193170e89c13c6244c24400fc57e88724ef610cd31",
+                "sha256:be2a9b390f77fd7676d80bc3cdc4f8edb940d8c198ed2d8c0be1319018c778e1",
+                "sha256:d5d8555d9bfc3f02385c1c37e9f998e2011f0db4f90e250e5bc0c0a85a813085",
+                "sha256:e55e22ac0a30023426564b1059b035973ec82186ddddbac867078435801c7801",
+                "sha256:e90f17980e6ab0f3c2f3730e56d1fe9bcba1891eeea58966e89d352492cc74f4",
+                "sha256:ecbb7b01409e9b782df5ded849c178a0aa7c906cf8c5a67368047daab282b184",
+                "sha256:ed01918d545a38998bfa5902c7c00e0fee90e957ce036a4000a88e3fe2264917",
+                "sha256:edabd457cd23a02965166026fd9bfd196f4324fe6032e866d0f3bd0301cd486f",
+                "sha256:fdf1c1dc5bafc32bc5d08b054f94d659422b05aba244d6be4ddc1c72d9aa70fb"
+            ],
+            "markers": "platform_python_implementation != 'pypy'",
+            "version": "==1.11.5"
+        },
+        "constantly": {
+            "hashes": [
+                "sha256:586372eb92059873e29eba4f9dec8381541b4d3834660707faf8ba59146dfc35",
+                "sha256:dd2fa9d6b1a51a83f0d7dd76293d734046aa176e384bf6e33b7e44880eb37c5d"
+            ],
+            "version": "==15.1.0"
+        },
+        "cryptography": {
+            "hashes": [
+                "sha256:3f3b65d5a16e6b52fba63dc860b62ca9832f51f1a2ae5083c78b6840275f12dd",
+                "sha256:551a3abfe0c8c6833df4192a63371aa2ff43afd8f570ed345d31f251d78e7e04",
+                "sha256:5cb990056b7cadcca26813311187ad751ea644712022a3976443691168781b6f",
+                "sha256:60bda7f12ecb828358be53095fc9c6edda7de8f1ef571f96c00b2363643fa3cd",
+                "sha256:6fef51ec447fe9f8351894024e94736862900d3a9aa2961528e602eb65c92bdb",
+                "sha256:77d0ad229d47a6e0272d00f6bf8ac06ce14715a9fd02c9a97f5a2869aab3ccb2",
+                "sha256:808fe471b1a6b777f026f7dc7bd9a4959da4bfab64972f2bbe91e22527c1c037",
+                "sha256:9b62fb4d18529c84b961efd9187fecbb48e89aa1a0f9f4161c61b7fc42a101bd",
+                "sha256:9e5bed45ec6b4f828866ac6a6bedf08388ffcfa68abe9e94b34bb40977aba531",
+                "sha256:9fc295bf69130a342e7a19a39d7bbeb15c0bcaabc7382ec33ef3b2b7d18d2f63",
+                "sha256:abd070b5849ed64e6d349199bef955ee0ad99aefbad792f0c587f8effa681a5e",
+                "sha256:ba6a774749b6e510cffc2fb98535f717e0e5fd91c7c99a61d223293df79ab351",
+                "sha256:c332118647f084c983c6a3e1dba0f3bcb051f69d12baccac68db8d62d177eb8a",
+                "sha256:d6f46e862ee36df81e6342c2177ba84e70f722d9dc9c6c394f9f1f434c4a5563",
+                "sha256:db6013746f73bf8edd9c3d1d3f94db635b9422f503db3fc5ef105233d4c011ab",
+                "sha256:f57008eaff597c69cf692c3518f6d4800f0309253bb138b526a37fe9ef0c7471",
+                "sha256:f6c821ac253c19f2ad4c8691633ae1d1a17f120d5b01ea1d256d7b602bc59887"
+            ],
+            "version": "==2.2.2"
+        },
+        "e1839a8": {
+            "editable": true,
+            "path": "."
+        },
+        "hyperlink": {
+            "hashes": [
+                "sha256:98da4218a56b448c7ec7d2655cb339af1f7d751cf541469bb4fc28c4a4245b34",
+                "sha256:f01b4ff744f14bc5d0a22a6b9f1525ab7d6312cb0ff967f59414bbac52f0a306"
+            ],
+            "version": "==18.0.0"
+        },
+        "idna": {
+            "hashes": [
+                "sha256:2c6a5de3089009e3da7c5dde64a141dbc8551d5b7f6cf4ed7c2568d0cc520a8f",
+                "sha256:8c7309c718f94b3a625cb648ace320157ad16ff131ae0af362c9f21b80ef6ec4"
+            ],
+            "version": "==2.6"
+        },
+        "incremental": {
+            "hashes": [
+                "sha256:717e12246dddf231a349175f48d74d93e2897244939173b01974ab6661406b9f",
+                "sha256:7b751696aaf36eebfab537e458929e194460051ccad279c72b755a167eebd4b3"
+            ],
+            "version": "==17.5.0"
+        },
+        "msgpack-python": {
+            "hashes": [
+                "sha256:378cc8a6d3545b532dfd149da715abae4fda2a3adb6d74e525d0d5e51f46909b"
+            ],
+            "version": "==0.5.6"
+        },
+        "pigpio": {
+            "hashes": [
+                "sha256:38bdc1b4d58898e7b4a69de3b0d90e8e8ccd851ac7d03e30791769475ffd941f",
+                "sha256:be1480aecf7c8aba9c92d2846ae153ad4c7e89ae188b28e4bcc579c3bc30e36b"
+            ],
+            "version": "==1.40.post1"
+        },
+        "pyasn1": {
+            "hashes": [
+                "sha256:0d7f6e959fe53f3960a23d73f35e1fce61348b30915b6664309ca756de7c1f89",
+                "sha256:5a0db897b311d265cde49615cf783f1c78613138605cdd0f907ecfa5b2aba3ee",
+                "sha256:758cb50abddc03e4563fd9e7f03db56e3e87b58c0bd01247360326e5c0c7ffa5",
+                "sha256:7d626683e3d792cccc608da02498aff37ab4f3dafd8905d6bf755d11f9b26b43",
+                "sha256:a7efe807c4b83a859e2735c692b92ed7b567cfddc4163763412920041d876c2b",
+                "sha256:b5a9ca48055b9a20f6d1b3d68e38692e5431c86a0f99ea602e61294e891fee5b",
+                "sha256:c07d6e587b2f928366b1f67c09bda026a3e6fcc99e80a744dc67f8fca3895626",
+                "sha256:d258b0a71994f7770599835249cece1caef3c70def868c4915e6e5ca49b67d15",
+                "sha256:d5cd6ed995dba16fad0c521cfe31cd2d68400b53fcc2bce93326829be73ab6d1",
+                "sha256:d84c2aea3cf43780e9e6a19f4e4dddee9f6976519020e64e47c57e5c7a8c3dd2",
+                "sha256:e85895087905c65b5b594eb91f7522664c85545b147d5f4d4e7b1b07da8dcbdc",
+                "sha256:f81c96761fca60d64b1c9b79ec2e40cf9495a745cf570613079ef324aeb9672b"
+            ],
+            "version": "==0.4.2"
+        },
+        "pyasn1-modules": {
+            "hashes": [
+                "sha256:041e9fbafac548d095f5b6c3b328b80792f006196e15a232b731a83c93d59493",
+                "sha256:0cdca76a68dcb701fff58c397de0ef9922b472b1cb3ea9695ca19d03f1869787",
+                "sha256:0cea139045c38f84abaa803bcb4b5e8775ea12a42af10019d942f227acc426c3",
+                "sha256:0f2e50d20bc670be170966638fa0ae603f0bc9ed6ebe8e97a6d1d4cef30cc889",
+                "sha256:47fb6757ab78fe966e7c58b2030b546854f78416d653163f0ce9290cf2278e8b",
+                "sha256:598a6004ec26a8ab40a39ea955068cf2a3949ad9c0030da970f2e1ca4c9f1cc9",
+                "sha256:72fd8b0c11191da088147c6e4678ec53e573923ecf60b57eeac9e97433e09fc2",
+                "sha256:854700bbdd01394e2ada9c1bfbd0ed9f5d0c551350dbbd023e88b11d2771ae06",
+                "sha256:af00ea8f2022b6287dc375b2c70f31ab5af83989fc6fe9eacd4976ce26cd7ccc",
+                "sha256:b1f395cae2d669e0830cb023aa86f9f283b7a9aa32317d7f80d8e78aa2745812",
+                "sha256:c6747146e95d2b14cc2a8399b2b0bde3f93778f8f9ec704690d2b589c376c137",
+                "sha256:f53fe5bcebdf318f51399b250fe8325ef3a26d927f012cc0c8e0f9e9af7f9deb"
+            ],
+            "version": "==0.2.1"
+        },
+        "pycparser": {
+            "hashes": [
+                "sha256:99a8ca03e29851d96616ad0404b4aad7d9ee16f25c9f9708a11faf2810f7b226"
+            ],
+            "version": "==2.18"
+        },
+        "pyopenssl": {
+            "hashes": [
+                "sha256:07a2de1a54de07448732a81e38a55df7da109b2f47f599f8bb35b0cbec69d4bd",
+                "sha256:2c10cfba46a52c0b0950118981d61e72c1e5b1aac451ca1bc77de1a679456773"
+            ],
+            "version": "==17.5.0"
+        },
+        "service-identity": {
+            "hashes": [
+                "sha256:0e76f3c042cc0f5c7e6da002cf646f59dc4023962d1d1166343ce53bdad39e17",
+                "sha256:4001fbb3da19e0df22c47a06d29681a398473af4aa9d745eca525b3b2c2302ab"
+            ],
+            "version": "==17.0.0"
+        },
+        "six": {
+            "hashes": [
+                "sha256:70e8a77beed4562e7f14fe23a786b54f6296e34344c23bc42f07b15018ff98e9",
+                "sha256:832dc0e10feb1aa2c68dcc57dbb658f1c7e65b9b61af69048abc87a2db00a0eb"
+            ],
+            "version": "==1.11.0"
+        },
+        "twisted": {
+            "hashes": [
+                "sha256:0da1a7e35d5fcae37bc9c7978970b5feb3bc82822155b8654ec63925c05af75c",
+                "sha256:716805e624f9396fcc1f47e8aef68e629fd31599a74855b6e1636122c042458d",
+                "sha256:7bc3cdfd1ca5e5b84c7936db3c2cb2feb7d5b77410e713fd346da095a3b6a1d2"
+            ],
+            "version": "==17.9.0"
+        },
+        "zope.interface": {
+            "hashes": [
+                "sha256:21506674d30c009271fe68a242d330c83b1b9d76d62d03d87e1e9528c61beea6",
+                "sha256:3d184aff0756c44fff7de69eb4cd5b5311b6f452d4de28cb08343b3f21993763",
+                "sha256:467d364b24cb398f76ad5e90398d71b9325eb4232be9e8a50d6a3b3c7a1c8789",
+                "sha256:57c38470d9f57e37afb460c399eb254e7193ac7fb8042bd09bdc001981a9c74c",
+                "sha256:9ada83f4384bbb12dedc152bcdd46a3ac9f5f7720d43ac3ce3e8e8b91d733c10",
+                "sha256:a1daf9c5120f3cc6f2b5fef8e1d2a3fb7bbbb20ed4bfdc25bc8364bc62dcf54b",
+                "sha256:e6b77ae84f2b8502d99a7855fa33334a1eb6159de45626905cb3e454c023f339",
+                "sha256:e881ef610ff48aece2f4ee2af03d2db1a146dc7c705561bd6089b2356f61641f",
+                "sha256:f41037260deaacb875db250021fe883bf536bf6414a4fd25b25059b02e31b120"
+            ],
+            "version": "==4.5.0"
+        }
+    }
+}
diff --git a/clock-test.py b/clock-test.py
new file mode 100755 (executable)
index 0000000..0945424
--- /dev/null
@@ -0,0 +1,62 @@
+#!/usr/bin/env python3
+
+import time
+import supcon.intf
+import supcon.core
+import supcon.clone
+
+from twisted.internet import reactor
+from twisted.internet.endpoints import TCP4ServerEndpoint
+
+""" the interface com.example.Clock """
+ComExampleClockIntf = supcon.intf.DInterface.load({
+  'name': 'com.example.Clock',
+  'events': [
+    {
+      'name': 'tick',
+      'args': [
+        { 'name': 'time', 'description': 'The current time' }
+      ],
+      'description': 'Fires every second'
+    }
+  ]
+})
+
+""" an implementation of the interface com.example.Clock """
+class ComExampleClockImpl(supcon.intf.Implementation):
+
+  def __init__(self, reactor):
+    super().__init__(ComExampleClockIntf)
+
+    self.__reactor = reactor
+    reactor.callLater(1, self.__tick)
+
+  def __tick(self):
+    t = time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.gmtime())
+    self.fire('tick', { 'time': t })
+    self.__reactor.callLater(1, self.__tick)
+
+""" create the implementation instanz """
+clockImpl = ComExampleClockImpl(reactor)
+
+""" create the local node """
+local = supcon.core.Node('clock-test')
+
+""" register the clock instance """
+def register():
+  if register.registered:
+    local.unregister('/clock5', clockImpl)
+  else:
+    local.register('/clock5', clockImpl)
+  register.registered = not register.registered
+  reactor.callLater(5, register)
+register.registered = False
+
+register()
+local.register('/clock', clockImpl)
+
+supcon.clone.Cloner(local, '/clone5', local.name, '/clock5', 'com.example.Clock')
+
+local.listen(TCP4ServerEndpoint(reactor, 8123))
+
+reactor.run()
diff --git a/doc-pdoc/css.mako b/doc-pdoc/css.mako
new file mode 100644 (file)
index 0000000..cda0e7b
--- /dev/null
@@ -0,0 +1,283 @@
+<%def name="pdoc()">
+  .CONTENT {
+    padding: 0;
+  }
+
+  #container {
+    display: flex;
+    flex-directtion: column;
+  }
+
+  #content {
+    padding: 30px;
+    border-left: 1px solid #ddd;
+  }
+  #sidebar {
+    padding: 30px;
+  }
+
+  #footer {
+    font-size: .75em;
+    padding: 5px 30px;
+    border-top: 1px solid #ddd;
+    text-align: right;
+  }
+  #footer p {
+    margin: 0 0 0 30px;
+    display: inline-block;
+  }
+
+  h1, h2, h3, h4, h5 {
+    font-weight: 300;
+  }
+  h1 {
+    font-size: 2.5em;
+    line-height: 1.1em;
+    margin: 0 0 .50em 0;
+  }
+
+  h2 {
+    font-size: 1.75em;
+    margin: 1em 0 .50em 0;
+  }
+
+  h3 {
+    margin: 25px 0 10px 0;
+  }
+
+  h4 {
+    margin: 0;
+    font-size: 105%;
+  }
+
+  a {
+    color: #058;
+    text-decoration: none;
+    transition: color .3s ease-in-out;
+  }
+
+  a:hover {
+    color: #e08524;
+    transition: color .3s ease-in-out;
+  }
+
+  pre, code, .mono, .name {
+    font-family: "Ubuntu Mono", "Cousine", "DejaVu Sans Mono", monospace;
+  }
+
+  .title .name {
+    font-weight: bold;
+  }
+  .section-title {
+    margin-top: 2em;
+  }
+  .ident {
+    color: #900;
+  }
+
+  code {
+    background: #f9f9f9;
+  } 
+
+  pre {
+    background: #fefefe;
+    border: 1px solid #ddd;
+    box-shadow: 2px 2px 0 #f3f3f3;
+    margin: 0 30px;
+    padding: 15px 30px;
+  }
+
+  .codehilite {
+    margin: 0 30px 10px 30px;
+  }
+
+    .codehilite pre {
+      margin: 0;
+    }
+    .codehilite .err { background: #ff3300; color: #fff !important; } 
+
+  table#module-list {
+    font-size: 110%;
+  }
+
+    table#module-list tr td:first-child {
+      padding-right: 10px;
+      white-space: nowrap;
+    }
+
+    table#module-list td {
+      vertical-align: top;
+      padding-bottom: 8px;
+    }
+
+      table#module-list td p {
+        margin: 0 0 7px 0;
+      }
+
+  .def {
+    display: table;
+  }
+
+    .def p {
+      display: table-cell;
+      vertical-align: top;
+      text-align: left;
+    }
+
+    .def p:first-child {
+      white-space: nowrap;
+    }
+
+    .def p:last-child {
+      width: 100%;
+    }
+
+
+  #index {
+    list-style-type: none;
+    margin: 0;
+    padding: 0;
+  }
+    ul#index .class_name {
+      /* font-size: 110%; */
+      font-weight: bold;
+    }
+    #index ul {
+      margin: 0;
+    }
+
+  .item {
+    margin: 0 0 15px 0;
+  }
+
+    .item .class {
+      margin: 0 0 25px 30px;
+    }
+
+      .item .class ul.class_list {
+        margin: 0 0 20px 0;
+      }
+
+    .item .name {
+      background: #fafafa;
+      margin: 0;
+      font-weight: bold;
+      padding: 5px 10px;
+      border-radius: 3px;
+      display: inline-block;
+      min-width: 40%;
+    }
+      .item .name:hover {
+        background: #f6f6f6;
+      }
+
+    .item .empty_desc {
+      margin: 0 0 5px 0;
+      padding: 0;
+    }
+
+    .item .inheritance {
+      margin: 3px 0 0 30px;
+    }
+
+    .item .inherited {
+      color: #666;
+    }
+
+    .item .desc {
+      padding: 0 8px;
+      margin: 0;
+    }
+
+      .item .desc p {
+        margin: 0 0 10px 0;
+      }
+
+    .source_cont {
+      margin: 0;
+      padding: 0;
+    }
+
+    .source_link a {
+      background: #ffc300;
+      font-weight: 400;
+      font-size: .75em;
+      text-transform: uppercase;
+      color: #fff;
+      text-shadow: 1px 1px 0 #f4b700;
+      
+      padding: 3px 8px;
+      border-radius: 2px;
+      transition: background .3s ease-in-out;
+    }
+      .source_link a:hover {
+        background: #FF7200;
+        text-shadow: none;
+        transition: background .3s ease-in-out;
+      }
+
+    .source {
+      display: none;
+      max-height: 600px;
+      overflow-y: scroll;
+      margin-bottom: 15px;
+    }
+
+      .source .codehilite {
+        margin: 0;
+      }
+
+  .desc h1, .desc h2, .desc h3 {
+    font-size: 100% !important;
+  }
+  .clear {
+    clear: both;
+  }
+
+  @media all and (max-width: 950px) {
+    #sidebar {
+      width: 35%;
+    }
+    #content {
+      width: 65%;
+    }
+  }
+  @media all and (max-width: 650px) {
+    #top {
+      display: none;
+    }
+    #sidebar {
+      float: none;
+      width: auto;
+    }
+    #content {
+      float: none;
+      width: auto;
+      padding: 30px;
+    }
+
+    #index ul {
+      padding: 0;
+      margin-bottom: 15px;
+    }
+    #index ul li {
+      display: inline-block;
+      margin-right: 30px;
+    }
+    #footer {
+      text-align: left;
+    }
+    #footer p {
+      display: block;
+      margin: inherit;
+    }
+  }
+
+  /*****************************/
+</%def>
+
+<%def name="pre()">
+</%def>
+
+<%def name="post()">
+</%def>
diff --git a/doc-pdoc/html.mako b/doc-pdoc/html.mako
new file mode 100644 (file)
index 0000000..ee7fffe
--- /dev/null
@@ -0,0 +1,513 @@
+<%
+  import re
+  import sys
+
+  import markdown
+  try:
+    import pygments
+    import pygments.formatters
+    import pygments.lexers
+    use_pygments = True
+  except ImportError:
+    use_pygments = False
+
+  import pdoc
+
+  # From language reference, but adds '.' to allow fully qualified names.
+  pyident = re.compile('^[a-zA-Z_][a-zA-Z0-9_.]+$')
+  indent = re.compile('^\s*')
+
+  # Whether we're showing the module list or a single module.
+  module_list = 'modules' in context.keys()
+
+  pdoc.html_module_suffix = '.m.md'
+  pdoc.html_package_name = 'index.md'
+
+  link_prefix = '/screwerk/'
+
+  def decode(s):
+    if sys.version_info[0] < 3 and isinstance(s, str):
+      return s.decode('utf-8', 'ignore')
+    return s
+
+  def ident(s):
+    return '<span class="ident">%s</span>' % s
+
+  def sourceid(dobj):
+    return 'source-%s' % dobj.refname
+
+  def clean_source_lines(lines):
+    """
+    Cleans the source code so that pygments can render it well.
+
+    Returns one string with all of the source code.
+    """
+    base_indent = len(indent.match(lines[0]).group(0))
+    base_indent = 0
+    for line in lines:
+      if len(line.strip()) > 0:
+        base_indent = len(indent.match(lines[0]).group(0))
+        break
+    lines = [line[base_indent:] for line in lines]
+    if not use_pygments:  # :-(
+      return '<pre><code>%s</code></pre>' % (''.join(lines))
+
+    pylex = pygments.lexers.PythonLexer()
+    htmlform = pygments.formatters.HtmlFormatter(cssclass='codehilite')
+    return pygments.highlight(''.join(lines), pylex, htmlform)
+
+  def linkify(match):
+    matched = match.group(0)
+    ident = matched[1:-1]
+    name, url = lookup(ident)
+    if name is None:
+      return matched
+    return '[`%s`](%s)' % (name, url)
+
+  def mark(s, linky=True):
+    if linky:
+      s, _ = re.subn('\b\n\b', ' ', s)
+    if not module_list:
+      s, _ = re.subn('`[^`]+`', linkify, s)
+
+    extensions = []
+    if use_pygments:
+      extensions = ['markdown.extensions.codehilite(linenums=False)']
+    s = markdown.markdown(s.strip(), extensions=extensions)
+    return s
+
+  def glimpse(s, length=100):
+    if len(s) < length:
+      return s
+    return s[0:length] + '...'
+
+  def module_url(m):
+    """
+    Returns a URL for `m`, which must be an instance of `Module`.
+    Also, `m` must be a submodule of the module being documented.
+
+    Namely, '.' import separators are replaced with '/' URL
+    separators. Also, packages are translated as directories
+    containing `index.html` corresponding to the `__init__` module,
+    while modules are translated as regular HTML files with an
+    `.m.html` suffix. (Given default values of
+    `pdoc.html_module_suffix` and `pdoc.html_package_name`.)
+    """
+    #if module.name == m.name:
+    #  return ''
+
+    if len(link_prefix) > 0:
+      base = m.name
+    else:
+      base = m.name[len(module.name)+1:]
+    url = base.replace('.', '/')
+    if m.is_package():
+      url += '/%s' % pdoc.html_package_name
+    else:
+      url += pdoc.html_module_suffix
+    return link_prefix + url
+
+  def external_url(refname):
+    """
+    Attempts to guess an absolute URL for the external identifier
+    given.
+
+    Note that this just returns the refname with an ".ext" suffix.
+    It will be up to whatever is interpreting the URLs to map it
+    to an appropriate documentation page.
+    """
+    return '/%s.ext' % refname
+
+  def is_external_linkable(name):
+    return external_links and pyident.match(name) and '.' in name
+
+  def lookup(refname):
+    """
+    Given a fully qualified identifier name, return its refname
+    with respect to the current module and a value for a `href`
+    attribute. If `refname` is not in the public interface of
+    this module or its submodules, then `None` is returned for
+    both return values. (Unless this module has enabled external
+    linking.)
+
+    In particular, this takes into account sub-modules and external
+    identifiers. If `refname` is in the public API of the current
+    module, then a local anchor link is given. If `refname` is in the
+    public API of a sub-module, then a link to a different page with
+    the appropriate anchor is given. Otherwise, `refname` is
+    considered external and no link is used.
+    """
+    d = module.find_ident(refname)
+    if isinstance(d, pdoc.External):
+      if is_external_linkable(refname):
+        return d.refname, external_url(d.refname)
+      else:
+        return None, None
+    if isinstance(d, pdoc.Module):
+      return d.refname, module_url(d)
+    if module.is_public(d.refname):
+      #return d.name, '#%s' % d.refname
+      return d.name, '%s#%s' % (module_url(d.module), d.refname)
+    return d.refname, '%s#%s' % (module_url(d.module), d.refname)
+
+  def link(refname):
+    """
+    A convenience wrapper around `href` to produce the full
+    `a` tag if `refname` is found. Otherwise, plain text of
+    `refname` is returned.
+    """
+    name, url = lookup(refname)
+    if name is None:
+      return refname
+    return '<a href="%s">%s</a>' % (url, name)
+
+  def lookupObj(cls, name):
+    for pCls in cls.__mro__:
+      pVars = vars(pCls)
+      if name in pVars:
+        return pVars[name]
+
+  def isInstMethod(o):
+    if not isinstance(o, pdoc.Function):
+      return False
+    if not o.cls or not o.cls.cls:
+      return False
+    obj = lookupObj(o.cls.cls, o.name)
+    if isinstance(obj, classmethod):
+      return False
+    if isinstance(obj, staticmethod):
+      return False
+    return True
+  
+  def isClassMethod(o):
+    if not isinstance(o, pdoc.Function):
+      return False
+    if not o.cls or not o.cls.cls:
+      return False
+    obj = lookupObj(o.cls.cls, o.name)
+    if not isinstance(obj, classmethod):
+      return False
+    return True
+  
+  def isStaticMethod(o):
+    if not isinstance(o, pdoc.Function):
+      return False
+    if not o.cls or not o.cls.cls:
+      return False
+    obj = lookupObj(o.cls.cls, o.name)
+    if not isinstance(obj, staticmethod):
+      return False
+    return True
+
+  def cInstMethods(c):
+    p = lambda o: isInstMethod(o) and c.module._docfilter(o)
+    return sorted(filter(p, c.doc.values()))
+
+  def cClassMethods(c):
+    p = lambda o: isClassMethod(o) and c.module._docfilter(o)
+    return sorted(filter(p, c.doc.values()))
+
+  def cStaticMethods(c):
+    p = lambda o: isStaticMethod(o) and c.module._docfilter(o)
+    return sorted(filter(p, c.doc.values()))
+
+%>
+<%def name="show_source(d)">
+  % if show_source_code and d.source is not None and len(d.source) > 0:
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('${sourceid(d)}', this);">Show source &equiv;</a></p>
+  <div id="${sourceid(d)}" class="source">
+    ${decode(clean_source_lines(d.source))}
+  </div>
+  % endif
+</%def>
+
+<%def name="show_desc(d, limit=None)">
+  <%
+  inherits = (hasattr(d, 'inherits')
+           and (len(d.docstring) == 0
+            or d.docstring == d.inherits.docstring))
+  docstring = (d.inherits.docstring if inherits else d.docstring).strip()
+  if limit is not None:
+    docstring = glimpse(docstring, limit)
+  %>
+  % if len(docstring) > 0:
+  % if inherits:
+    <div class="desc inherited">${docstring | mark}</div>
+  % else:
+    <div class="desc">${docstring | mark}</div>
+  % endif
+  % endif
+  % if not isinstance(d, pdoc.Module):
+  <div class="source_cont">${show_source(d)}</div>
+  % endif
+</%def>
+
+<%def name="show_inheritance(d)">
+  % if hasattr(d, 'inherits'):
+    <p class="inheritance">
+     <strong>Inheritance:</strong>
+     % if hasattr(d.inherits, 'cls'):
+       <code>${link(d.inherits.cls.refname)}</code>.<code>${link(d.inherits.refname)}</code>
+     % else:
+       <code>${link(d.inherits.refname)}</code>
+     % endif
+    </p>
+  % endif
+</%def>
+
+<%def name="show_module_list(modules)">
+<h1>Python module list</h1>
+
+% if len(modules) == 0:
+  <p>No modules found.</p>
+% else:
+  <table id="module-list">
+  % for name, desc in modules:
+    <tr>
+      <td><a href="${link_prefix}${name}">${name}</a></td>
+      <td>
+      % if len(desc.strip()) > 0:
+        <div class="desc">${desc | mark}</div>
+      % endif
+      </td>
+    </tr>
+  % endfor
+  </table>
+% endif
+</%def>
+
+<%def name="show_column_list(items, numcols=3)">
+  <ul>
+  % for item in items:
+    <li class="mono">${item}</li>
+  % endfor
+  </ul>
+</%def>
+
+<%def name="show_module(module)">
+  <%
+  variables = module.variables()
+  classes = module.classes()
+  functions = module.functions()
+  submodules = module.submodules()
+  %>
+
+  <%def name="show_func(f)">
+  <div class="item">
+    <div class="name def" id="${f.refname}">
+    <p>def ${ident(f.name)}(</p><p>${f.spec() | h})</p>
+    </div>
+    ${show_inheritance(f)}
+    ${show_desc(f)}
+  </div>
+  </%def>
+
+  % if 'http_server' in context.keys() and http_server:
+    <p id="nav">
+      <a href="/">All packages</a>
+      <% parts = module.name.split('.')[:-1] %>
+      % for i, m in enumerate(parts):
+        <% parent = '.'.join(parts[:i+1]) %>
+        :: <a href="/${parent.replace('.', '/')}">${parent}</a>
+      % endfor
+    </p>
+  % endif
+
+  <header id="section-intro">
+  <h1 class="title"><span class="name">${module.name}</span> module</h1>
+  ${module.docstring | mark}
+  ${show_source(module)}
+  </header>
+
+  <section id="section-items">
+    % if len(variables) > 0:
+    <h2 class="section-title" id="header-variables">Module variables</h2>
+    % for v in variables:
+      <div class="item">
+      <p id="${v.refname}" class="name">var ${ident(v.name)}</p>
+      ${show_desc(v)}
+      </div>
+    % endfor
+    % endif
+
+    % if len(functions) > 0:
+    <h2 class="section-title" id="header-functions">Functions</h2>
+    % for f in functions:
+      ${show_func(f)}
+    % endfor
+    % endif
+
+    % if len(classes) > 0:
+    <h2 class="section-title" id="header-classes">Classes</h2>
+    % for c in classes:
+      <%
+      class_vars = c.class_variables()
+      inst_vars = c.instance_variables()
+      instMethods = cInstMethods(c)
+      classMethods = cClassMethods(c)
+      staticMethods = cStaticMethods(c)
+      mro = c.module.mro(c)
+      %>
+      <div class="item">
+      <p id="${c.refname}" class="name">class ${ident(c.name)}</p>
+      ${show_desc(c)}
+
+      <div class="class">
+        % if len(mro) > 0:
+          <h3>Ancestors (in MRO)</h3>
+          <ul class="class_list">
+          % for cls in mro:
+          <li>${link(cls.refname)}</li>
+          % endfor
+          </ul>
+        % endif
+        % if len(staticMethods) > 0:
+          <h3>Static Methods</h3>
+          % for f in staticMethods:
+            ${show_func(f)}
+          % endfor
+        % endif
+        % if len(class_vars) > 0:
+          <h3>Class variables</h3>
+          % for v in class_vars:
+            <div class="item">
+            <p id="${v.refname}" class="name">var ${ident(v.name)}</p>
+            ${show_inheritance(v)}
+            ${show_desc(v)}
+            </div>
+          % endfor
+        % endif
+        % if len(classMethods) > 0:
+          <h3>Class Methods</h3>
+          % for f in classMethods:
+            ${show_func(f)}
+          % endfor
+        % endif
+        % if len(inst_vars) > 0:
+          <h3>Instance variables</h3>
+          % for v in inst_vars:
+            <div class="item">
+            <p id="${v.refname}" class="name">var ${ident(v.name)}</p>
+            ${show_inheritance(v)}
+            ${show_desc(v)}
+            </div>
+          % endfor
+        % endif
+        % if len(instMethods) > 0:
+          <h3>Methods</h3>
+          % for f in instMethods:
+            ${show_func(f)}
+          % endfor
+        % endif
+      </div>
+      </div>
+    % endfor
+    % endif
+
+    % if len(submodules) > 0:
+    <h2 class="section-title" id="header-submodules">Sub-modules</h2>
+    % for m in submodules:
+      <div class="item">
+      <p class="name">${link(m.refname)}</p>
+      ${show_desc(m, limit=300)}
+      </div>
+    % endfor
+    % endif
+  </section>
+</%def>
+
+<%def name="module_index(module)">
+  <%
+  variables = module.variables()
+  classes = module.classes()
+  functions = module.functions()
+  submodules = module.submodules()
+  %>
+  <div id="sidebar">
+    <a href="/screwerk/supcon">Doc</a>
+
+    <h1>Index</h1>
+    <ul id="index">
+    % if len(variables) > 0:
+    <li class="set"><h3><a href="${module_url(module)}#header-variables">Module variables</a></h3>
+      ${show_column_list(map(lambda v: link(v.refname), variables))}
+    </li>
+    % endif
+
+    % if len(functions) > 0:
+    <li class="set"><h3><a href="${module_url(module)}#header-functions">Functions</a></h3>
+      ${show_column_list(map(lambda f: link(f.refname), functions))}
+    </li>
+    % endif
+
+    % if len(classes) > 0:
+    <li class="set"><h3><a href="${module_url(module)}#header-classes">Classes</a></h3>
+      <ul>
+      % for c in classes:
+        <li class="mono">
+        <span class="class_name">${link(c.refname)}</span>
+        <%
+          #methods = c.functions() + c.methods()
+          methods = cStaticMethods(c) + cClassMethods(c) + cInstMethods(c)
+        %>
+        % if len(methods) > 0:
+          ${show_column_list(map(lambda f: link(f.refname), methods))}
+        % endif
+        </li>
+      % endfor
+      </ul>
+    </li>
+    % endif
+
+    % if len(submodules) > 0:
+    <li class="set"><h3><a href="${module_url(module)}#header-submodules">Sub-modules</a></h3>
+      <ul>
+      % for m in submodules:
+        <li class="mono">${link(m.refname)}</li>
+      % endfor
+      </ul>
+    </li>
+    % endif
+    </ul>
+  </div>
+</%def>
+
+<link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,300' rel='stylesheet' type='text/css'>
+<%namespace name="css" file="css.mako" />
+
+<style type="text/css">
+${css.pdoc()}
+</style>
+
+% if use_pygments:
+<style type="text/css">
+${pygments.formatters.HtmlFormatter().get_style_defs('.codehilite')}
+</style>
+% endif
+
+<script type="text/javascript">
+function toggle(id, $link) {
+  $node = document.getElementById(id);
+  if (!$node) return;
+  if (!$node.style.display || $node.style.display == 'none') {
+    $node.style.display = 'block';
+    $link.innerHTML = 'Hide source &nequiv;';
+  } else {
+    $node.style.display = 'none';
+    $link.innerHTML = 'Show source &equiv;';
+  }
+}
+</script>
+
+<div id="container">
+  % if module_list:
+    <article id="content">
+      ${show_module_list(modules)}
+    </article>
+  % else:
+    ${module_index(module)}
+    <article id="content">
+      ${show_module(module)}
+    </article>
+  % endif
+</div>
diff --git a/doc-pdoc/text.mako b/doc-pdoc/text.mako
new file mode 100644 (file)
index 0000000..1040c89
--- /dev/null
@@ -0,0 +1,162 @@
+## Define mini-templates for each portion of the doco.
+
+<%
+  import re
+  import pdoc
+
+  def indent(s, spaces=4):
+    """
+    Inserts `spaces` after each string of new lines in `s`
+    and before the start of the string.
+    """
+    new = re.sub('(\n+)', '\\1%s' % (' ' * spaces), s)
+    return (' ' * spaces) + new.strip()
+
+  def docstring(d):
+    if len(d.docstring) == 0 and hasattr(d, 'inherits'):
+      return d.inherits.docstring
+    else:
+      return d.docstring
+
+  def submoduleRef(m):
+    ref = './{}' if m.is_package() else './{}.m.md'
+    return ref.format(m.name.split('.')[-1])
+
+  def header(n, header):
+    return '#' * n + ' {}'.format(header)
+
+  def url(d, suffix = None):
+    if d.refname[0:len(module.refname)] != module.refname:
+      raise ValueError(d.refname)
+    url = '#' + d.refname[len(module.refname) + 1:]
+    url+= '-{}'.format(suffix) if suffix else ''
+    return url
+
+  def target(d, suffix = None):
+    url = d.refname[len(module.refname) + 1:]
+    url+= '-{}'.format(suffix) if suffix else ''
+    return '<a name="{}"></a>'.format(url)
+
+  def linkTo(label, d, suffix = None):
+    if isinstance(d, pdoc.External):
+      return label
+    return '[{}]({})'.format(label, url(d, suffix))
+%>
+
+<%def name="function(func)" filter="trim">
+${func.name}(${func.spec()})
+${docstring(func) | indent}
+</%def>
+
+<%def name="variable(var)" filter="trim">
+${var.name}
+${docstring(var) | indent}
+</%def>
+
+<%def name="class_(cls)" filter="trim">
+${target(cls)}
+${header(3, cls.name)}
+% if len(cls.docstring) > 0:
+
+${cls.docstring}
+% endif
+<%
+  class_vars = cls.class_variables()
+  static_methods = cls.functions()
+  inst_vars = cls.instance_variables()
+  methods = cls.methods()
+  mro = cls.module.mro(cls)
+  descendents = cls.module.descendents(cls)
+%>
+% if len(mro) > 0:
+${header(4, 'Ancestors (in MRO)')}
+% for c in mro:
+* ${linkTo(c.refname, c)}
+% endfor
+
+% endif
+% if len(descendents) > 0:
+${header(4, 'Descendents')}
+% for c in descendents:
+* ${linkTo(c.refname, c)}
+% endfor
+
+% endif
+% if len(class_vars) > 0:
+${header(4, 'Class variables')}
+    % for v in class_vars:
+${capture(variable, v) | indent}
+
+    % endfor
+% endif
+% if len(static_methods) > 0:
+${header(4, 'Static methods')}
+    % for f in static_methods:
+${capture(function, f) | indent}
+
+    % endfor
+% endif
+% if len(inst_vars) > 0:
+${header(4, 'Instance variables')}
+    % for v in inst_vars:
+${variable(v)}
+
+    % endfor
+% endif
+% if len(methods) > 0:
+${header(4, 'Methods')}
+    % for m in methods:
+${capture(function, m) | indent}
+
+    % endfor
+% endif
+</%def>
+
+## Start the output logic for an entire module.
+
+<%
+  variables = module.variables()
+  classes = module.classes()
+  functions = module.functions()
+  submodules = module.submodules()
+%>
+
+${header(1, 'Module '+module.name)}
+% if not module._filtering:
+${module.docstring}
+% endif
+
+
+% if len(variables) > 0:
+${header(2, 'Variables')}
+    % for v in variables:
+${variable(v)}
+
+    % endfor
+% endif
+
+
+% if len(functions) > 0:
+${header(2, 'Functions')}
+    % for f in functions:
+${function(f)}
+
+    % endfor
+% endif
+
+
+% if len(classes) > 0:
+${header(2, 'Classes')}
+    % for c in classes:
+${class_(c)}
+
+    % endfor
+% endif
+
+
+% if len(submodules) > 0:
+${header(2, 'Sub-modules')}
+% for m in submodules:
+[${m.name}](${submoduleRef(m)})
+% endfor
+% endif
diff --git a/doc/clone.m.md b/doc/clone.m.md
new file mode 100644 (file)
index 0000000..4704df0
--- /dev/null
@@ -0,0 +1,679 @@
+<link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,300' rel='stylesheet' type='text/css'>
+
+
+<style type="text/css">
+
+  .CONTENT {
+    padding: 0;
+  }
+
+  #container {
+    display: flex;
+    flex-directtion: column;
+  }
+
+  #content {
+    padding: 30px;
+    border-left: 1px solid #ddd;
+  }
+  #sidebar {
+    padding: 30px;
+  }
+
+  #footer {
+    font-size: .75em;
+    padding: 5px 30px;
+    border-top: 1px solid #ddd;
+    text-align: right;
+  }
+  #footer p {
+    margin: 0 0 0 30px;
+    display: inline-block;
+  }
+
+  h1, h2, h3, h4, h5 {
+    font-weight: 300;
+  }
+  h1 {
+    font-size: 2.5em;
+    line-height: 1.1em;
+    margin: 0 0 .50em 0;
+  }
+
+  h2 {
+    font-size: 1.75em;
+    margin: 1em 0 .50em 0;
+  }
+
+  h3 {
+    margin: 25px 0 10px 0;
+  }
+
+  h4 {
+    margin: 0;
+    font-size: 105%;
+  }
+
+  a {
+    color: #058;
+    text-decoration: none;
+    transition: color .3s ease-in-out;
+  }
+
+  a:hover {
+    color: #e08524;
+    transition: color .3s ease-in-out;
+  }
+
+  pre, code, .mono, .name {
+    font-family: "Ubuntu Mono", "Cousine", "DejaVu Sans Mono", monospace;
+  }
+
+  .title .name {
+    font-weight: bold;
+  }
+  .section-title {
+    margin-top: 2em;
+  }
+  .ident {
+    color: #900;
+  }
+
+  code {
+    background: #f9f9f9;
+  } 
+
+  pre {
+    background: #fefefe;
+    border: 1px solid #ddd;
+    box-shadow: 2px 2px 0 #f3f3f3;
+    margin: 0 30px;
+    padding: 15px 30px;
+  }
+
+  .codehilite {
+    margin: 0 30px 10px 30px;
+  }
+
+    .codehilite pre {
+      margin: 0;
+    }
+    .codehilite .err { background: #ff3300; color: #fff !important; } 
+
+  table#module-list {
+    font-size: 110%;
+  }
+
+    table#module-list tr td:first-child {
+      padding-right: 10px;
+      white-space: nowrap;
+    }
+
+    table#module-list td {
+      vertical-align: top;
+      padding-bottom: 8px;
+    }
+
+      table#module-list td p {
+        margin: 0 0 7px 0;
+      }
+
+  .def {
+    display: table;
+  }
+
+    .def p {
+      display: table-cell;
+      vertical-align: top;
+      text-align: left;
+    }
+
+    .def p:first-child {
+      white-space: nowrap;
+    }
+
+    .def p:last-child {
+      width: 100%;
+    }
+
+
+  #index {
+    list-style-type: none;
+    margin: 0;
+    padding: 0;
+  }
+    ul#index .class_name {
+      /* font-size: 110%; */
+      font-weight: bold;
+    }
+    #index ul {
+      margin: 0;
+    }
+
+  .item {
+    margin: 0 0 15px 0;
+  }
+
+    .item .class {
+      margin: 0 0 25px 30px;
+    }
+
+      .item .class ul.class_list {
+        margin: 0 0 20px 0;
+      }
+
+    .item .name {
+      background: #fafafa;
+      margin: 0;
+      font-weight: bold;
+      padding: 5px 10px;
+      border-radius: 3px;
+      display: inline-block;
+      min-width: 40%;
+    }
+      .item .name:hover {
+        background: #f6f6f6;
+      }
+
+    .item .empty_desc {
+      margin: 0 0 5px 0;
+      padding: 0;
+    }
+
+    .item .inheritance {
+      margin: 3px 0 0 30px;
+    }
+
+    .item .inherited {
+      color: #666;
+    }
+
+    .item .desc {
+      padding: 0 8px;
+      margin: 0;
+    }
+
+      .item .desc p {
+        margin: 0 0 10px 0;
+      }
+
+    .source_cont {
+      margin: 0;
+      padding: 0;
+    }
+
+    .source_link a {
+      background: #ffc300;
+      font-weight: 400;
+      font-size: .75em;
+      text-transform: uppercase;
+      color: #fff;
+      text-shadow: 1px 1px 0 #f4b700;
+      
+      padding: 3px 8px;
+      border-radius: 2px;
+      transition: background .3s ease-in-out;
+    }
+      .source_link a:hover {
+        background: #FF7200;
+        text-shadow: none;
+        transition: background .3s ease-in-out;
+      }
+
+    .source {
+      display: none;
+      max-height: 600px;
+      overflow-y: scroll;
+      margin-bottom: 15px;
+    }
+
+      .source .codehilite {
+        margin: 0;
+      }
+
+  .desc h1, .desc h2, .desc h3 {
+    font-size: 100% !important;
+  }
+  .clear {
+    clear: both;
+  }
+
+  @media all and (max-width: 950px) {
+    #sidebar {
+      width: 35%;
+    }
+    #content {
+      width: 65%;
+    }
+  }
+  @media all and (max-width: 650px) {
+    #top {
+      display: none;
+    }
+    #sidebar {
+      float: none;
+      width: auto;
+    }
+    #content {
+      float: none;
+      width: auto;
+      padding: 30px;
+    }
+
+    #index ul {
+      padding: 0;
+      margin-bottom: 15px;
+    }
+    #index ul li {
+      display: inline-block;
+      margin-right: 30px;
+    }
+    #footer {
+      text-align: left;
+    }
+    #footer p {
+      display: block;
+      margin: inherit;
+    }
+  }
+
+  /*****************************/
+
+</style>
+
+<style type="text/css">
+.codehilite .hll { background-color: #ffffcc }
+.codehilite  { background: #f8f8f8; }
+.codehilite .c { color: #408080; font-style: italic } /* Comment */
+.codehilite .err { border: 1px solid #FF0000 } /* Error */
+.codehilite .k { color: #008000; font-weight: bold } /* Keyword */
+.codehilite .o { color: #666666 } /* Operator */
+.codehilite .ch { color: #408080; font-style: italic } /* Comment.Hashbang */
+.codehilite .cm { color: #408080; font-style: italic } /* Comment.Multiline */
+.codehilite .cp { color: #BC7A00 } /* Comment.Preproc */
+.codehilite .cpf { color: #408080; font-style: italic } /* Comment.PreprocFile */
+.codehilite .c1 { color: #408080; font-style: italic } /* Comment.Single */
+.codehilite .cs { color: #408080; font-style: italic } /* Comment.Special */
+.codehilite .gd { color: #A00000 } /* Generic.Deleted */
+.codehilite .ge { font-style: italic } /* Generic.Emph */
+.codehilite .gr { color: #FF0000 } /* Generic.Error */
+.codehilite .gh { color: #000080; font-weight: bold } /* Generic.Heading */
+.codehilite .gi { color: #00A000 } /* Generic.Inserted */
+.codehilite .go { color: #888888 } /* Generic.Output */
+.codehilite .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
+.codehilite .gs { font-weight: bold } /* Generic.Strong */
+.codehilite .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
+.codehilite .gt { color: #0044DD } /* Generic.Traceback */
+.codehilite .kc { color: #008000; font-weight: bold } /* Keyword.Constant */
+.codehilite .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
+.codehilite .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
+.codehilite .kp { color: #008000 } /* Keyword.Pseudo */
+.codehilite .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
+.codehilite .kt { color: #B00040 } /* Keyword.Type */
+.codehilite .m { color: #666666 } /* Literal.Number */
+.codehilite .s { color: #BA2121 } /* Literal.String */
+.codehilite .na { color: #7D9029 } /* Name.Attribute */
+.codehilite .nb { color: #008000 } /* Name.Builtin */
+.codehilite .nc { color: #0000FF; font-weight: bold } /* Name.Class */
+.codehilite .no { color: #880000 } /* Name.Constant */
+.codehilite .nd { color: #AA22FF } /* Name.Decorator */
+.codehilite .ni { color: #999999; font-weight: bold } /* Name.Entity */
+.codehilite .ne { color: #D2413A; font-weight: bold } /* Name.Exception */
+.codehilite .nf { color: #0000FF } /* Name.Function */
+.codehilite .nl { color: #A0A000 } /* Name.Label */
+.codehilite .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
+.codehilite .nt { color: #008000; font-weight: bold } /* Name.Tag */
+.codehilite .nv { color: #19177C } /* Name.Variable */
+.codehilite .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
+.codehilite .w { color: #bbbbbb } /* Text.Whitespace */
+.codehilite .mb { color: #666666 } /* Literal.Number.Bin */
+.codehilite .mf { color: #666666 } /* Literal.Number.Float */
+.codehilite .mh { color: #666666 } /* Literal.Number.Hex */
+.codehilite .mi { color: #666666 } /* Literal.Number.Integer */
+.codehilite .mo { color: #666666 } /* Literal.Number.Oct */
+.codehilite .sa { color: #BA2121 } /* Literal.String.Affix */
+.codehilite .sb { color: #BA2121 } /* Literal.String.Backtick */
+.codehilite .sc { color: #BA2121 } /* Literal.String.Char */
+.codehilite .dl { color: #BA2121 } /* Literal.String.Delimiter */
+.codehilite .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
+.codehilite .s2 { color: #BA2121 } /* Literal.String.Double */
+.codehilite .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */
+.codehilite .sh { color: #BA2121 } /* Literal.String.Heredoc */
+.codehilite .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */
+.codehilite .sx { color: #008000 } /* Literal.String.Other */
+.codehilite .sr { color: #BB6688 } /* Literal.String.Regex */
+.codehilite .s1 { color: #BA2121 } /* Literal.String.Single */
+.codehilite .ss { color: #19177C } /* Literal.String.Symbol */
+.codehilite .bp { color: #008000 } /* Name.Builtin.Pseudo */
+.codehilite .fm { color: #0000FF } /* Name.Function.Magic */
+.codehilite .vc { color: #19177C } /* Name.Variable.Class */
+.codehilite .vg { color: #19177C } /* Name.Variable.Global */
+.codehilite .vi { color: #19177C } /* Name.Variable.Instance */
+.codehilite .vm { color: #19177C } /* Name.Variable.Magic */
+.codehilite .il { color: #666666 } /* Literal.Number.Integer.Long */
+</style>
+
+<script type="text/javascript">
+function toggle(id, $link) {
+  $node = document.getElementById(id);
+  if (!$node) return;
+  if (!$node.style.display || $node.style.display == 'none') {
+    $node.style.display = 'block';
+    $link.innerHTML = 'Hide source &nequiv;';
+  } else {
+    $node.style.display = 'none';
+    $link.innerHTML = 'Show source &equiv;';
+  }
+}
+</script>
+
+<div id="container">
+    
+  
+  <div id="sidebar">
+    <a href="/screwerk/supcon">Doc</a>
+
+    <h1>Index</h1>
+    <ul id="index">
+
+
+    <li class="set"><h3><a href="/screwerk/supcon/clone.m.md#header-classes">Classes</a></h3>
+      <ul>
+        <li class="mono">
+        <span class="class_name"><a href="/screwerk/supcon/clone.m.md#supcon.clone.Cloner">Cloner</a></span>
+        
+          
+  <ul>
+    <li class="mono"><a href="/screwerk/supcon/clone.m.md#supcon.clone.Cloner.__init__">__init__</a></li>
+  </ul>
+
+        </li>
+      </ul>
+    </li>
+
+    </ul>
+  </div>
+
+    <article id="content">
+      
+  
+
+  
+
+
+  <header id="section-intro">
+  <h1 class="title"><span class="name">supcon.clone</span> module</h1>
+  
+  
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.clone', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.clone" class="source">
+    <div class="codehilite"><pre><span></span><span class="c1"># -*- coding: utf-8 -*-</span>
+
+<span class="kn">import</span> <span class="nn">supcon.intf</span>
+
+<span class="k">class</span> <span class="nc">_Clone</span><span class="p">(</span><span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">Implementation</span><span class="p">):</span>
+
+  <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">local</span><span class="p">,</span> <span class="n">rnode</span><span class="p">,</span> <span class="n">rpath</span><span class="p">,</span> <span class="n">interface</span><span class="p">):</span>
+    <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">interface</span><span class="p">)</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__local</span> <span class="o">=</span> <span class="n">local</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__rnode</span> <span class="o">=</span> <span class="n">rnode</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__rpath</span> <span class="o">=</span> <span class="n">rpath</span>
+
+    <span class="k">for</span> <span class="n">event</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">interface</span><span class="o">.</span><span class="n">events</span><span class="p">:</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">on</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__rnode</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__rpath</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__on</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="fm">__del__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="k">for</span> <span class="n">event</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">interface</span><span class="o">.</span><span class="n">events</span><span class="p">:</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">off</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__rnode</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__rpath</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__on</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">__on</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
+    <span class="p">(</span><span class="n">_Node</span><span class="p">,</span> <span class="n">_Path</span><span class="p">,</span> <span class="n">_Intf</span><span class="p">,</span> <span class="n">eEvent</span><span class="p">)</span> <span class="o">=</span> <span class="n">event</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">fire</span><span class="p">(</span><span class="n">eEvent</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">call</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">inArgs</span><span class="p">):</span>
+    <span class="c1">#print(&#39;_Clone.call&#39;, method, inArgs)</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__rnode</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__rpath</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">intf</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">inArgs</span><span class="p">)</span>
+
+<span class="k">class</span> <span class="nc">Cloner</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+
+  <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">local</span><span class="p">:</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">Node</span><span class="p">,</span> <span class="n">lPath</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">rNode</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">rPath</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">rIntf</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
+    <span class="c1">#print(&#39;Cloner.__init__&#39;)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__local</span> <span class="o">=</span> <span class="n">local</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__lPath</span> <span class="o">=</span> <span class="n">lPath</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__rNode</span> <span class="o">=</span> <span class="n">rNode</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__rPath</span> <span class="o">=</span> <span class="n">rPath</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__rIntf</span> <span class="o">=</span> <span class="n">rIntf</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__impl</span> <span class="o">=</span> <span class="bp">None</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">on</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;supcon.Local&#39;</span><span class="p">,</span> <span class="s1">&#39;intf&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__onIntf</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">on</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;supcon.Local&#39;</span><span class="p">,</span> <span class="s1">&#39;intfLost&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__onIntf</span><span class="p">)</span>
+
+    <span class="n">nodes</span> <span class="o">=</span> <span class="n">local</span><span class="o">.</span><span class="n">nodes</span><span class="p">()</span>
+    <span class="k">if</span> <span class="n">nodes</span><span class="o">.</span><span class="n">hasIntf</span><span class="p">(</span><span class="n">rNode</span><span class="p">,</span> <span class="n">rPath</span><span class="p">,</span> <span class="n">rIntf</span><span class="p">):</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__setupImpl</span><span class="p">(</span><span class="n">nodes</span><span class="p">[</span><span class="n">rNode</span><span class="p">][</span><span class="n">rPath</span><span class="p">][</span><span class="n">rIntf</span><span class="p">])</span>
+
+  <span class="nd">@property</span>
+  <span class="k">def</span> <span class="nf">local</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">Node</span><span class="p">:</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__local</span>
+
+  <span class="nd">@property</span>
+  <span class="k">def</span> <span class="nf">lPath</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__lPath</span>
+
+  <span class="nd">@property</span>
+  <span class="k">def</span> <span class="nf">rNode</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__rNode</span>
+
+  <span class="nd">@property</span>
+  <span class="k">def</span> <span class="nf">rPath</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__rPath</span>
+
+  <span class="nd">@property</span>
+  <span class="k">def</span> <span class="nf">rIntf</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__rIntf</span>
+
+  <span class="k">def</span> <span class="nf">__onIntf</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
+    <span class="k">if</span> <span class="n">args</span><span class="p">[</span><span class="s1">&#39;node&#39;</span><span class="p">]</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__rNode</span> <span class="ow">or</span> <span class="n">args</span><span class="p">[</span><span class="s1">&#39;path&#39;</span><span class="p">]</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__rPath</span><span class="p">:</span>
+      <span class="k">return</span>
+    <span class="n">aInterface</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">DInterface</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="s1">&#39;intf&#39;</span><span class="p">])</span>
+    <span class="k">if</span> <span class="n">aInterface</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__rIntf</span><span class="p">:</span>
+      <span class="k">return</span>
+
+    <span class="k">if</span> <span class="n">event</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;intf&#39;</span><span class="p">:</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__setupImpl</span><span class="p">(</span><span class="n">aInterface</span><span class="p">)</span>
+    <span class="k">else</span><span class="p">:</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__teardownImpl</span><span class="p">()</span>
+
+  <span class="k">def</span> <span class="nf">__setupImpl</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">interface</span><span class="p">):</span>
+    <span class="c1">#print(&#39;Cloner.__setupImpl&#39;)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__impl</span> <span class="o">=</span> <span class="n">_Clone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__rNode</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__rPath</span><span class="p">,</span> <span class="n">interface</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__lPath</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impl</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">__teardownImpl</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">unregister</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__lPath</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impl</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__impl</span> <span class="o">=</span> <span class="bp">None</span>
+</pre></div>
+
+  </div>
+
+  </header>
+
+  <section id="section-items">
+
+
+    <h2 class="section-title" id="header-classes">Classes</h2>
+      
+      <div class="item">
+      <p id="supcon.clone.Cloner" class="name">class <span class="ident">Cloner</span></p>
+      
+  
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.clone.Cloner', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.clone.Cloner" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">Cloner</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+
+  <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">local</span><span class="p">:</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">Node</span><span class="p">,</span> <span class="n">lPath</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">rNode</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">rPath</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">rIntf</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
+    <span class="c1">#print(&#39;Cloner.__init__&#39;)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__local</span> <span class="o">=</span> <span class="n">local</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__lPath</span> <span class="o">=</span> <span class="n">lPath</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__rNode</span> <span class="o">=</span> <span class="n">rNode</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__rPath</span> <span class="o">=</span> <span class="n">rPath</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__rIntf</span> <span class="o">=</span> <span class="n">rIntf</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__impl</span> <span class="o">=</span> <span class="bp">None</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">on</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;supcon.Local&#39;</span><span class="p">,</span> <span class="s1">&#39;intf&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__onIntf</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">on</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;supcon.Local&#39;</span><span class="p">,</span> <span class="s1">&#39;intfLost&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__onIntf</span><span class="p">)</span>
+
+    <span class="n">nodes</span> <span class="o">=</span> <span class="n">local</span><span class="o">.</span><span class="n">nodes</span><span class="p">()</span>
+    <span class="k">if</span> <span class="n">nodes</span><span class="o">.</span><span class="n">hasIntf</span><span class="p">(</span><span class="n">rNode</span><span class="p">,</span> <span class="n">rPath</span><span class="p">,</span> <span class="n">rIntf</span><span class="p">):</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__setupImpl</span><span class="p">(</span><span class="n">nodes</span><span class="p">[</span><span class="n">rNode</span><span class="p">][</span><span class="n">rPath</span><span class="p">][</span><span class="n">rIntf</span><span class="p">])</span>
+
+  <span class="nd">@property</span>
+  <span class="k">def</span> <span class="nf">local</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">Node</span><span class="p">:</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__local</span>
+
+  <span class="nd">@property</span>
+  <span class="k">def</span> <span class="nf">lPath</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__lPath</span>
+
+  <span class="nd">@property</span>
+  <span class="k">def</span> <span class="nf">rNode</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__rNode</span>
+
+  <span class="nd">@property</span>
+  <span class="k">def</span> <span class="nf">rPath</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__rPath</span>
+
+  <span class="nd">@property</span>
+  <span class="k">def</span> <span class="nf">rIntf</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__rIntf</span>
+
+  <span class="k">def</span> <span class="nf">__onIntf</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
+    <span class="k">if</span> <span class="n">args</span><span class="p">[</span><span class="s1">&#39;node&#39;</span><span class="p">]</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__rNode</span> <span class="ow">or</span> <span class="n">args</span><span class="p">[</span><span class="s1">&#39;path&#39;</span><span class="p">]</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__rPath</span><span class="p">:</span>
+      <span class="k">return</span>
+    <span class="n">aInterface</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">DInterface</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="s1">&#39;intf&#39;</span><span class="p">])</span>
+    <span class="k">if</span> <span class="n">aInterface</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__rIntf</span><span class="p">:</span>
+      <span class="k">return</span>
+
+    <span class="k">if</span> <span class="n">event</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;intf&#39;</span><span class="p">:</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__setupImpl</span><span class="p">(</span><span class="n">aInterface</span><span class="p">)</span>
+    <span class="k">else</span><span class="p">:</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__teardownImpl</span><span class="p">()</span>
+
+  <span class="k">def</span> <span class="nf">__setupImpl</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">interface</span><span class="p">):</span>
+    <span class="c1">#print(&#39;Cloner.__setupImpl&#39;)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__impl</span> <span class="o">=</span> <span class="n">_Clone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__rNode</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__rPath</span><span class="p">,</span> <span class="n">interface</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__lPath</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impl</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">__teardownImpl</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">unregister</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__lPath</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impl</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__impl</span> <span class="o">=</span> <span class="bp">None</span>
+</pre></div>
+
+  </div>
+</div>
+
+
+      <div class="class">
+          <h3>Ancestors (in MRO)</h3>
+          <ul class="class_list">
+          <li><a href="/screwerk/supcon/clone.m.md#supcon.clone.Cloner">Cloner</a></li>
+          <li>builtins.object</li>
+          </ul>
+          <h3>Instance variables</h3>
+            <div class="item">
+            <p id="supcon.clone.Cloner.lPath" class="name">var <span class="ident">lPath</span></p>
+            
+
+            
+  
+  <div class="source_cont">
+</div>
+
+            </div>
+            <div class="item">
+            <p id="supcon.clone.Cloner.local" class="name">var <span class="ident">local</span></p>
+            
+
+            
+  
+  <div class="source_cont">
+</div>
+
+            </div>
+            <div class="item">
+            <p id="supcon.clone.Cloner.rIntf" class="name">var <span class="ident">rIntf</span></p>
+            
+
+            
+  
+  <div class="source_cont">
+</div>
+
+            </div>
+            <div class="item">
+            <p id="supcon.clone.Cloner.rNode" class="name">var <span class="ident">rNode</span></p>
+            
+
+            
+  
+  <div class="source_cont">
+</div>
+
+            </div>
+            <div class="item">
+            <p id="supcon.clone.Cloner.rPath" class="name">var <span class="ident">rPath</span></p>
+            
+
+            
+  
+  <div class="source_cont">
+</div>
+
+            </div>
+          <h3>Methods</h3>
+            
+  <div class="item">
+    <div class="name def" id="supcon.clone.Cloner.__init__">
+    <p>def <span class="ident">__init__</span>(</p><p>self, local, lPath, rNode, rPath, rIntf)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Initialize self.  See help(type(self)) for accurate signature.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.clone.Cloner.__init__', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.clone.Cloner.__init__" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">local</span><span class="p">:</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">Node</span><span class="p">,</span> <span class="n">lPath</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">rNode</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">rPath</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">rIntf</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
+  <span class="c1">#print(&#39;Cloner.__init__&#39;)</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__local</span> <span class="o">=</span> <span class="n">local</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__lPath</span> <span class="o">=</span> <span class="n">lPath</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__rNode</span> <span class="o">=</span> <span class="n">rNode</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__rPath</span> <span class="o">=</span> <span class="n">rPath</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__rIntf</span> <span class="o">=</span> <span class="n">rIntf</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__impl</span> <span class="o">=</span> <span class="bp">None</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">on</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;supcon.Local&#39;</span><span class="p">,</span> <span class="s1">&#39;intf&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__onIntf</span><span class="p">)</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">on</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;supcon.Local&#39;</span><span class="p">,</span> <span class="s1">&#39;intfLost&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__onIntf</span><span class="p">)</span>
+  <span class="n">nodes</span> <span class="o">=</span> <span class="n">local</span><span class="o">.</span><span class="n">nodes</span><span class="p">()</span>
+  <span class="k">if</span> <span class="n">nodes</span><span class="o">.</span><span class="n">hasIntf</span><span class="p">(</span><span class="n">rNode</span><span class="p">,</span> <span class="n">rPath</span><span class="p">,</span> <span class="n">rIntf</span><span class="p">):</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__setupImpl</span><span class="p">(</span><span class="n">nodes</span><span class="p">[</span><span class="n">rNode</span><span class="p">][</span><span class="n">rPath</span><span class="p">][</span><span class="n">rIntf</span><span class="p">])</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+      </div>
+      </div>
+
+  </section>
+
+    </article>
+</div>
diff --git a/doc/core.m.md b/doc/core.m.md
new file mode 100644 (file)
index 0000000..a851689
--- /dev/null
@@ -0,0 +1,1988 @@
+<link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,300' rel='stylesheet' type='text/css'>
+
+
+<style type="text/css">
+
+  .CONTENT {
+    padding: 0;
+  }
+
+  #container {
+    display: flex;
+    flex-directtion: column;
+  }
+
+  #content {
+    padding: 30px;
+    border-left: 1px solid #ddd;
+  }
+  #sidebar {
+    padding: 30px;
+  }
+
+  #footer {
+    font-size: .75em;
+    padding: 5px 30px;
+    border-top: 1px solid #ddd;
+    text-align: right;
+  }
+  #footer p {
+    margin: 0 0 0 30px;
+    display: inline-block;
+  }
+
+  h1, h2, h3, h4, h5 {
+    font-weight: 300;
+  }
+  h1 {
+    font-size: 2.5em;
+    line-height: 1.1em;
+    margin: 0 0 .50em 0;
+  }
+
+  h2 {
+    font-size: 1.75em;
+    margin: 1em 0 .50em 0;
+  }
+
+  h3 {
+    margin: 25px 0 10px 0;
+  }
+
+  h4 {
+    margin: 0;
+    font-size: 105%;
+  }
+
+  a {
+    color: #058;
+    text-decoration: none;
+    transition: color .3s ease-in-out;
+  }
+
+  a:hover {
+    color: #e08524;
+    transition: color .3s ease-in-out;
+  }
+
+  pre, code, .mono, .name {
+    font-family: "Ubuntu Mono", "Cousine", "DejaVu Sans Mono", monospace;
+  }
+
+  .title .name {
+    font-weight: bold;
+  }
+  .section-title {
+    margin-top: 2em;
+  }
+  .ident {
+    color: #900;
+  }
+
+  code {
+    background: #f9f9f9;
+  } 
+
+  pre {
+    background: #fefefe;
+    border: 1px solid #ddd;
+    box-shadow: 2px 2px 0 #f3f3f3;
+    margin: 0 30px;
+    padding: 15px 30px;
+  }
+
+  .codehilite {
+    margin: 0 30px 10px 30px;
+  }
+
+    .codehilite pre {
+      margin: 0;
+    }
+    .codehilite .err { background: #ff3300; color: #fff !important; } 
+
+  table#module-list {
+    font-size: 110%;
+  }
+
+    table#module-list tr td:first-child {
+      padding-right: 10px;
+      white-space: nowrap;
+    }
+
+    table#module-list td {
+      vertical-align: top;
+      padding-bottom: 8px;
+    }
+
+      table#module-list td p {
+        margin: 0 0 7px 0;
+      }
+
+  .def {
+    display: table;
+  }
+
+    .def p {
+      display: table-cell;
+      vertical-align: top;
+      text-align: left;
+    }
+
+    .def p:first-child {
+      white-space: nowrap;
+    }
+
+    .def p:last-child {
+      width: 100%;
+    }
+
+
+  #index {
+    list-style-type: none;
+    margin: 0;
+    padding: 0;
+  }
+    ul#index .class_name {
+      /* font-size: 110%; */
+      font-weight: bold;
+    }
+    #index ul {
+      margin: 0;
+    }
+
+  .item {
+    margin: 0 0 15px 0;
+  }
+
+    .item .class {
+      margin: 0 0 25px 30px;
+    }
+
+      .item .class ul.class_list {
+        margin: 0 0 20px 0;
+      }
+
+    .item .name {
+      background: #fafafa;
+      margin: 0;
+      font-weight: bold;
+      padding: 5px 10px;
+      border-radius: 3px;
+      display: inline-block;
+      min-width: 40%;
+    }
+      .item .name:hover {
+        background: #f6f6f6;
+      }
+
+    .item .empty_desc {
+      margin: 0 0 5px 0;
+      padding: 0;
+    }
+
+    .item .inheritance {
+      margin: 3px 0 0 30px;
+    }
+
+    .item .inherited {
+      color: #666;
+    }
+
+    .item .desc {
+      padding: 0 8px;
+      margin: 0;
+    }
+
+      .item .desc p {
+        margin: 0 0 10px 0;
+      }
+
+    .source_cont {
+      margin: 0;
+      padding: 0;
+    }
+
+    .source_link a {
+      background: #ffc300;
+      font-weight: 400;
+      font-size: .75em;
+      text-transform: uppercase;
+      color: #fff;
+      text-shadow: 1px 1px 0 #f4b700;
+      
+      padding: 3px 8px;
+      border-radius: 2px;
+      transition: background .3s ease-in-out;
+    }
+      .source_link a:hover {
+        background: #FF7200;
+        text-shadow: none;
+        transition: background .3s ease-in-out;
+      }
+
+    .source {
+      display: none;
+      max-height: 600px;
+      overflow-y: scroll;
+      margin-bottom: 15px;
+    }
+
+      .source .codehilite {
+        margin: 0;
+      }
+
+  .desc h1, .desc h2, .desc h3 {
+    font-size: 100% !important;
+  }
+  .clear {
+    clear: both;
+  }
+
+  @media all and (max-width: 950px) {
+    #sidebar {
+      width: 35%;
+    }
+    #content {
+      width: 65%;
+    }
+  }
+  @media all and (max-width: 650px) {
+    #top {
+      display: none;
+    }
+    #sidebar {
+      float: none;
+      width: auto;
+    }
+    #content {
+      float: none;
+      width: auto;
+      padding: 30px;
+    }
+
+    #index ul {
+      padding: 0;
+      margin-bottom: 15px;
+    }
+    #index ul li {
+      display: inline-block;
+      margin-right: 30px;
+    }
+    #footer {
+      text-align: left;
+    }
+    #footer p {
+      display: block;
+      margin: inherit;
+    }
+  }
+
+  /*****************************/
+
+</style>
+
+<style type="text/css">
+.codehilite .hll { background-color: #ffffcc }
+.codehilite  { background: #f8f8f8; }
+.codehilite .c { color: #408080; font-style: italic } /* Comment */
+.codehilite .err { border: 1px solid #FF0000 } /* Error */
+.codehilite .k { color: #008000; font-weight: bold } /* Keyword */
+.codehilite .o { color: #666666 } /* Operator */
+.codehilite .ch { color: #408080; font-style: italic } /* Comment.Hashbang */
+.codehilite .cm { color: #408080; font-style: italic } /* Comment.Multiline */
+.codehilite .cp { color: #BC7A00 } /* Comment.Preproc */
+.codehilite .cpf { color: #408080; font-style: italic } /* Comment.PreprocFile */
+.codehilite .c1 { color: #408080; font-style: italic } /* Comment.Single */
+.codehilite .cs { color: #408080; font-style: italic } /* Comment.Special */
+.codehilite .gd { color: #A00000 } /* Generic.Deleted */
+.codehilite .ge { font-style: italic } /* Generic.Emph */
+.codehilite .gr { color: #FF0000 } /* Generic.Error */
+.codehilite .gh { color: #000080; font-weight: bold } /* Generic.Heading */
+.codehilite .gi { color: #00A000 } /* Generic.Inserted */
+.codehilite .go { color: #888888 } /* Generic.Output */
+.codehilite .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
+.codehilite .gs { font-weight: bold } /* Generic.Strong */
+.codehilite .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
+.codehilite .gt { color: #0044DD } /* Generic.Traceback */
+.codehilite .kc { color: #008000; font-weight: bold } /* Keyword.Constant */
+.codehilite .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
+.codehilite .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
+.codehilite .kp { color: #008000 } /* Keyword.Pseudo */
+.codehilite .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
+.codehilite .kt { color: #B00040 } /* Keyword.Type */
+.codehilite .m { color: #666666 } /* Literal.Number */
+.codehilite .s { color: #BA2121 } /* Literal.String */
+.codehilite .na { color: #7D9029 } /* Name.Attribute */
+.codehilite .nb { color: #008000 } /* Name.Builtin */
+.codehilite .nc { color: #0000FF; font-weight: bold } /* Name.Class */
+.codehilite .no { color: #880000 } /* Name.Constant */
+.codehilite .nd { color: #AA22FF } /* Name.Decorator */
+.codehilite .ni { color: #999999; font-weight: bold } /* Name.Entity */
+.codehilite .ne { color: #D2413A; font-weight: bold } /* Name.Exception */
+.codehilite .nf { color: #0000FF } /* Name.Function */
+.codehilite .nl { color: #A0A000 } /* Name.Label */
+.codehilite .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
+.codehilite .nt { color: #008000; font-weight: bold } /* Name.Tag */
+.codehilite .nv { color: #19177C } /* Name.Variable */
+.codehilite .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
+.codehilite .w { color: #bbbbbb } /* Text.Whitespace */
+.codehilite .mb { color: #666666 } /* Literal.Number.Bin */
+.codehilite .mf { color: #666666 } /* Literal.Number.Float */
+.codehilite .mh { color: #666666 } /* Literal.Number.Hex */
+.codehilite .mi { color: #666666 } /* Literal.Number.Integer */
+.codehilite .mo { color: #666666 } /* Literal.Number.Oct */
+.codehilite .sa { color: #BA2121 } /* Literal.String.Affix */
+.codehilite .sb { color: #BA2121 } /* Literal.String.Backtick */
+.codehilite .sc { color: #BA2121 } /* Literal.String.Char */
+.codehilite .dl { color: #BA2121 } /* Literal.String.Delimiter */
+.codehilite .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
+.codehilite .s2 { color: #BA2121 } /* Literal.String.Double */
+.codehilite .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */
+.codehilite .sh { color: #BA2121 } /* Literal.String.Heredoc */
+.codehilite .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */
+.codehilite .sx { color: #008000 } /* Literal.String.Other */
+.codehilite .sr { color: #BB6688 } /* Literal.String.Regex */
+.codehilite .s1 { color: #BA2121 } /* Literal.String.Single */
+.codehilite .ss { color: #19177C } /* Literal.String.Symbol */
+.codehilite .bp { color: #008000 } /* Name.Builtin.Pseudo */
+.codehilite .fm { color: #0000FF } /* Name.Function.Magic */
+.codehilite .vc { color: #19177C } /* Name.Variable.Class */
+.codehilite .vg { color: #19177C } /* Name.Variable.Global */
+.codehilite .vi { color: #19177C } /* Name.Variable.Instance */
+.codehilite .vm { color: #19177C } /* Name.Variable.Magic */
+.codehilite .il { color: #666666 } /* Literal.Number.Integer.Long */
+</style>
+
+<script type="text/javascript">
+function toggle(id, $link) {
+  $node = document.getElementById(id);
+  if (!$node) return;
+  if (!$node.style.display || $node.style.display == 'none') {
+    $node.style.display = 'block';
+    $link.innerHTML = 'Hide source &nequiv;';
+  } else {
+    $node.style.display = 'none';
+    $link.innerHTML = 'Show source &equiv;';
+  }
+}
+</script>
+
+<div id="container">
+    
+  
+  <div id="sidebar">
+    <a href="/screwerk/supcon">Doc</a>
+
+    <h1>Index</h1>
+    <ul id="index">
+    <li class="set"><h3><a href="/screwerk/supcon/core.m.md#header-variables">Module variables</a></h3>
+      
+  <ul>
+    <li class="mono"><a href="/screwerk/supcon/core.m.md#supcon.core.LocalIntf">LocalIntf</a></li>
+    <li class="mono"><a href="/screwerk/supcon/core.m.md#supcon.core.RemoteIntf">RemoteIntf</a></li>
+  </ul>
+
+    </li>
+
+
+    <li class="set"><h3><a href="/screwerk/supcon/core.m.md#header-classes">Classes</a></h3>
+      <ul>
+        <li class="mono">
+        <span class="class_name"><a href="/screwerk/supcon/core.m.md#supcon.core.Node">Node</a></span>
+        
+          
+  <ul>
+    <li class="mono"><a href="/screwerk/supcon/core.m.md#supcon.core.Node.toName">toName</a></li>
+    <li class="mono"><a href="/screwerk/supcon/core.m.md#supcon.core.Node.__init__">__init__</a></li>
+    <li class="mono"><a href="/screwerk/supcon/core.m.md#supcon.core.Node.call">call</a></li>
+    <li class="mono"><a href="/screwerk/supcon/core.m.md#supcon.core.Node.connect">connect</a></li>
+    <li class="mono"><a href="/screwerk/supcon/core.m.md#supcon.core.Node.listen">listen</a></li>
+    <li class="mono"><a href="/screwerk/supcon/core.m.md#supcon.core.Node.nodes">nodes</a></li>
+    <li class="mono"><a href="/screwerk/supcon/core.m.md#supcon.core.Node.off">off</a></li>
+    <li class="mono"><a href="/screwerk/supcon/core.m.md#supcon.core.Node.on">on</a></li>
+    <li class="mono"><a href="/screwerk/supcon/core.m.md#supcon.core.Node.register">register</a></li>
+    <li class="mono"><a href="/screwerk/supcon/core.m.md#supcon.core.Node.unregister">unregister</a></li>
+  </ul>
+
+        </li>
+      </ul>
+    </li>
+
+    </ul>
+  </div>
+
+    <article id="content">
+      
+  
+
+  
+
+
+  <header id="section-intro">
+  <h1 class="title"><span class="name">supcon.core</span> module</h1>
+  <p>This module provides the implementation of abstract class <code>supcon.intf.Node</code>.</p>
+  
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.core', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.core" class="source">
+    <div class="codehilite"><pre><span></span><span class="c1"># -*- coding: utf-8 -*-</span>
+<span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">This module provides the implementation of abstract class `supcon.intf.Node`.</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="kn">import</span> <span class="nn">sys</span>
+<span class="kn">import</span> <span class="nn">traceback</span>
+
+<span class="kn">import</span> <span class="nn">uuid</span>
+<span class="kn">import</span> <span class="nn">struct</span>
+<span class="kn">import</span> <span class="nn">msgpack</span>
+
+<span class="kn">import</span> <span class="nn">twisted.internet.defer</span> <span class="kn">as</span> <span class="nn">defer</span>
+<span class="kn">import</span> <span class="nn">twisted.internet.protocol</span>
+<span class="kn">import</span> <span class="nn">twisted.internet.endpoints</span>
+
+<span class="kn">import</span> <span class="nn">twisted.application.service</span>
+<span class="kn">import</span> <span class="nn">twisted.application.internet</span>
+
+<span class="kn">import</span> <span class="nn">supcon.intf</span>
+
+<span class="n">_printArgs</span> <span class="o">=</span> <span class="k">lambda</span> <span class="o">*</span><span class="n">args</span><span class="p">:</span> <span class="k">print</span><span class="p">(</span><span class="s1">&#39;, &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="s1">&#39;{}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">args</span><span class="p">]))</span>
+
+<span class="n">LocalIntf</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">DInterface</span><span class="o">.</span><span class="n">load</span><span class="p">({</span>
+  <span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="s1">&#39;supcon.Local&#39;</span><span class="p">,</span>
+  <span class="s1">&#39;events&#39;</span><span class="p">:</span> <span class="p">[</span>
+    <span class="p">{</span>
+      <span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="s1">&#39;node&#39;</span><span class="p">,</span>
+      <span class="s1">&#39;args&#39;</span><span class="p">:</span> <span class="p">[</span>
+        <span class="p">{</span><span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="s1">&#39;node&#39;</span><span class="p">,</span> <span class="s1">&#39;description&#39;</span><span class="p">:</span> <span class="s1">&#39;The node&#39;</span><span class="p">},</span>
+      <span class="p">],</span>
+    <span class="p">},</span>
+    <span class="p">{</span>
+      <span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="s1">&#39;nodeLost&#39;</span><span class="p">,</span>
+      <span class="s1">&#39;args&#39;</span><span class="p">:</span> <span class="p">[</span>
+        <span class="p">{</span><span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="s1">&#39;node&#39;</span><span class="p">,</span> <span class="s1">&#39;description&#39;</span><span class="p">:</span> <span class="s1">&#39;The lost node&#39;</span><span class="p">},</span>
+      <span class="p">],</span>
+    <span class="p">},</span>
+    <span class="p">{</span>
+      <span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="s1">&#39;path&#39;</span><span class="p">,</span>
+      <span class="s1">&#39;args&#39;</span><span class="p">:</span> <span class="p">[</span>
+        <span class="p">{</span><span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="s1">&#39;node&#39;</span><span class="p">,</span> <span class="s1">&#39;description&#39;</span><span class="p">:</span> <span class="s1">&#39;The node&#39;</span><span class="p">},</span>
+        <span class="p">{</span><span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="s1">&#39;path&#39;</span><span class="p">,</span> <span class="s1">&#39;description&#39;</span><span class="p">:</span> <span class="s1">&#39;The path&#39;</span><span class="p">},</span>
+      <span class="p">],</span>
+    <span class="p">},</span>
+    <span class="p">{</span>
+      <span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="s1">&#39;pathLost&#39;</span><span class="p">,</span>
+      <span class="s1">&#39;args&#39;</span><span class="p">:</span> <span class="p">[</span>
+        <span class="p">{</span><span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="s1">&#39;node&#39;</span><span class="p">,</span> <span class="s1">&#39;description&#39;</span><span class="p">:</span> <span class="s1">&#39;The node&#39;</span><span class="p">},</span>
+        <span class="p">{</span><span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="s1">&#39;path&#39;</span><span class="p">,</span> <span class="s1">&#39;description&#39;</span><span class="p">:</span> <span class="s1">&#39;The path&#39;</span><span class="p">},</span>
+      <span class="p">],</span>
+    <span class="p">},</span>
+    <span class="p">{</span>
+      <span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="s1">&#39;intf&#39;</span><span class="p">,</span>
+      <span class="s1">&#39;args&#39;</span><span class="p">:</span> <span class="p">[</span>
+        <span class="p">{</span><span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="s1">&#39;node&#39;</span><span class="p">,</span> <span class="s1">&#39;description&#39;</span><span class="p">:</span> <span class="s1">&#39;The node&#39;</span><span class="p">},</span>
+        <span class="p">{</span><span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="s1">&#39;path&#39;</span><span class="p">,</span> <span class="s1">&#39;description&#39;</span><span class="p">:</span> <span class="s1">&#39;The path&#39;</span><span class="p">},</span>
+        <span class="p">{</span><span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="s1">&#39;intf&#39;</span><span class="p">,</span> <span class="s1">&#39;description&#39;</span><span class="p">:</span> <span class="s1">&#39;The interface&#39;</span><span class="p">},</span>
+      <span class="p">],</span>
+    <span class="p">},</span>
+    <span class="p">{</span>
+      <span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="s1">&#39;intfLost&#39;</span><span class="p">,</span>
+      <span class="s1">&#39;args&#39;</span><span class="p">:</span> <span class="p">[</span>
+        <span class="p">{</span><span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="s1">&#39;node&#39;</span><span class="p">,</span> <span class="s1">&#39;description&#39;</span><span class="p">:</span> <span class="s1">&#39;The node&#39;</span><span class="p">},</span>
+        <span class="p">{</span><span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="s1">&#39;path&#39;</span><span class="p">,</span> <span class="s1">&#39;description&#39;</span><span class="p">:</span> <span class="s1">&#39;The path&#39;</span><span class="p">},</span>
+        <span class="p">{</span><span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="s1">&#39;intf&#39;</span><span class="p">,</span> <span class="s1">&#39;description&#39;</span><span class="p">:</span> <span class="s1">&#39;The interface&#39;</span><span class="p">},</span>
+      <span class="p">],</span>
+    <span class="p">},</span>
+  <span class="p">],</span>
+  <span class="s1">&#39;methods&#39;</span><span class="p">:</span> <span class="p">[</span>
+    <span class="p">{</span>
+      <span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="s1">&#39;nodes&#39;</span><span class="p">,</span>
+      <span class="s1">&#39;outArgs&#39;</span><span class="p">:</span> <span class="p">[</span>
+        <span class="p">{</span><span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="s1">&#39;nodes&#39;</span><span class="p">,</span> <span class="s1">&#39;description&#39;</span><span class="p">:</span> <span class="s1">&#39;A datastructure about all known nodes, paths and interfaces&#39;</span><span class="p">},</span>
+      <span class="p">],</span>
+    <span class="p">},</span>
+  <span class="p">],</span>
+  <span class="s1">&#39;description&#39;</span><span class="p">:</span> <span class="s1">&#39;All methods and events are only locally available&#39;</span>
+<span class="p">})</span>
+
+<span class="n">RemoteIntf</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">DInterface</span><span class="o">.</span><span class="n">load</span><span class="p">({</span>
+  <span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="s1">&#39;supcon.Remote&#39;</span><span class="p">,</span>
+  <span class="s1">&#39;events&#39;</span><span class="p">:</span> <span class="p">[</span>
+    <span class="p">{</span>
+      <span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="s1">&#39;intf&#39;</span><span class="p">,</span>
+      <span class="s1">&#39;args&#39;</span><span class="p">:</span> <span class="p">[</span>
+        <span class="p">{</span><span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="s1">&#39;path&#39;</span><span class="p">,</span> <span class="s1">&#39;description&#39;</span><span class="p">:</span> <span class="s1">&#39;The path&#39;</span><span class="p">},</span>
+        <span class="p">{</span><span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="s1">&#39;intf&#39;</span><span class="p">,</span> <span class="s1">&#39;description&#39;</span><span class="p">:</span> <span class="s1">&#39;The interface&#39;</span><span class="p">},</span>
+      <span class="p">],</span>
+    <span class="p">},</span>
+    <span class="p">{</span>
+      <span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="s1">&#39;intfLost&#39;</span><span class="p">,</span>
+      <span class="s1">&#39;args&#39;</span><span class="p">:</span> <span class="p">[</span>
+        <span class="p">{</span><span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="s1">&#39;path&#39;</span><span class="p">,</span> <span class="s1">&#39;description&#39;</span><span class="p">:</span> <span class="s1">&#39;The path&#39;</span><span class="p">},</span>
+        <span class="p">{</span><span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="s1">&#39;intf&#39;</span><span class="p">,</span> <span class="s1">&#39;description&#39;</span><span class="p">:</span> <span class="s1">&#39;The interface&#39;</span><span class="p">},</span>
+      <span class="p">],</span>
+    <span class="p">},</span>
+  <span class="p">],</span>
+  <span class="s1">&#39;methods&#39;</span><span class="p">:</span> <span class="p">[</span>
+    <span class="p">{</span>
+      <span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="s1">&#39;node&#39;</span><span class="p">,</span>
+      <span class="s1">&#39;outArgs&#39;</span><span class="p">:</span> <span class="p">[</span>
+        <span class="p">{</span><span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="s1">&#39;node&#39;</span><span class="p">,</span> <span class="s1">&#39;description&#39;</span><span class="p">:</span> <span class="s1">&#39;A datastructure about all paths and interfaces of the node&#39;</span><span class="p">},</span>
+      <span class="p">],</span>
+    <span class="p">},</span>
+    <span class="p">{</span>
+      <span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="s1">&#39;on&#39;</span><span class="p">,</span>
+      <span class="s1">&#39;inArgs&#39;</span><span class="p">:</span> <span class="p">[</span>
+        <span class="p">{</span><span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="s1">&#39;path&#39;</span><span class="p">,</span> <span class="s1">&#39;description&#39;</span><span class="p">:</span> <span class="s1">&#39;The path&#39;</span><span class="p">},</span>
+        <span class="p">{</span><span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="s1">&#39;intf&#39;</span><span class="p">,</span> <span class="s1">&#39;description&#39;</span><span class="p">:</span> <span class="s1">&#39;The interface&#39;</span><span class="p">},</span>
+        <span class="p">{</span><span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="s1">&#39;event&#39;</span><span class="p">,</span> <span class="s1">&#39;description&#39;</span><span class="p">:</span> <span class="s1">&#39;The event&#39;</span><span class="p">},</span>
+      <span class="p">],</span>
+    <span class="p">},</span>
+    <span class="p">{</span>
+      <span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="s1">&#39;off&#39;</span><span class="p">,</span>
+      <span class="s1">&#39;inArgs&#39;</span><span class="p">:</span> <span class="p">[</span>
+        <span class="p">{</span><span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="s1">&#39;path&#39;</span><span class="p">,</span> <span class="s1">&#39;description&#39;</span><span class="p">:</span> <span class="s1">&#39;The path&#39;</span><span class="p">},</span>
+        <span class="p">{</span><span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="s1">&#39;intf&#39;</span><span class="p">,</span> <span class="s1">&#39;description&#39;</span><span class="p">:</span> <span class="s1">&#39;The interface&#39;</span><span class="p">},</span>
+        <span class="p">{</span><span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="s1">&#39;event&#39;</span><span class="p">,</span> <span class="s1">&#39;description&#39;</span><span class="p">:</span> <span class="s1">&#39;The event&#39;</span><span class="p">},</span>
+      <span class="p">],</span>
+    <span class="p">},</span>
+  <span class="p">],</span>
+  <span class="s1">&#39;description&#39;</span><span class="p">:</span> <span class="s1">&#39;All methods and events are only used internally&#39;</span>
+<span class="p">})</span>
+
+
+<span class="k">class</span> <span class="nc">_Protocol</span><span class="p">(</span><span class="n">twisted</span><span class="o">.</span><span class="n">internet</span><span class="o">.</span><span class="n">protocol</span><span class="o">.</span><span class="n">Protocol</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;This class handels handshake and message encoding between nodes on the bus.</span>
+
+<span class="sd">  This class is just an implementation detail of the class Node.</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">()</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">factory</span> <span class="o">=</span> <span class="bp">None</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__data</span> <span class="o">=</span> <span class="nb">bytearray</span><span class="p">()</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__name</span> <span class="o">=</span> <span class="bp">None</span>
+
+  <span class="k">def</span> <span class="nf">connectionMade</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">sendMesg</span><span class="p">({</span>
+      <span class="s1">&#39;type&#39;</span><span class="p">:</span> <span class="s1">&#39;handshake&#39;</span><span class="p">,</span>
+      <span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">factory</span><span class="o">.</span><span class="n">name</span>
+    <span class="p">})</span>
+
+  <span class="k">def</span> <span class="nf">connectionLost</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">reason</span><span class="p">):</span>
+    <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">__name</span><span class="p">:</span>
+      <span class="k">return</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">factory</span><span class="o">.</span><span class="n">delNode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__name</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">dataReceived</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__data</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
+
+    <span class="k">while</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__data</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">4</span><span class="p">:</span>
+
+      <span class="n">size</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack_from</span><span class="p">(</span><span class="s1">&#39;&lt;L&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__data</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
+      <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__data</span><span class="p">)</span> <span class="o">&lt;</span> <span class="n">size</span> <span class="o">+</span> <span class="mi">4</span><span class="p">:</span>
+        <span class="k">break</span>
+
+      <span class="n">mesg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__data</span><span class="p">[</span><span class="mi">4</span><span class="p">:</span><span class="n">size</span> <span class="o">+</span> <span class="mi">4</span><span class="p">]</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__data</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__data</span><span class="p">[</span><span class="n">size</span> <span class="o">+</span> <span class="mi">4</span><span class="p">:]</span>
+
+      <span class="k">try</span><span class="p">:</span>
+        <span class="n">mesg</span> <span class="o">=</span> <span class="n">msgpack</span><span class="o">.</span><span class="n">unpackb</span><span class="p">(</span><span class="n">mesg</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s1">&#39;utf-8&#39;</span><span class="p">)</span>
+      <span class="k">except</span> <span class="ne">BaseException</span> <span class="k">as</span> <span class="n">_</span><span class="p">:</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">transport</span><span class="o">.</span><span class="n">loseConnection</span><span class="p">()</span>
+      <span class="k">else</span><span class="p">:</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">recvMesg</span><span class="p">(</span><span class="n">mesg</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">recvMesg</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">mesg</span><span class="p">):</span>
+    <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">__name</span><span class="p">:</span>
+      <span class="k">if</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">&#39;type&#39;</span><span class="p">]</span> <span class="o">!=</span> <span class="s1">&#39;handshake&#39;</span><span class="p">:</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">transport</span><span class="o">.</span><span class="n">loseConnection</span><span class="p">()</span>
+        <span class="k">return</span>
+
+      <span class="bp">self</span><span class="o">.</span><span class="n">__name</span> <span class="o">=</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">&#39;name&#39;</span><span class="p">]</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">factory</span><span class="o">.</span><span class="n">addNode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__name</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
+    <span class="k">else</span><span class="p">:</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">factory</span><span class="o">.</span><span class="n">recvMesg</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__name</span><span class="p">,</span> <span class="n">mesg</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">sendMesg</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">mesg</span><span class="p">):</span>
+    <span class="n">data</span> <span class="o">=</span> <span class="n">msgpack</span><span class="o">.</span><span class="n">packb</span><span class="p">(</span><span class="n">mesg</span><span class="p">,</span> <span class="n">use_bin_type</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
+    <span class="n">size</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;&lt;L&#39;</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">))</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">transport</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">size</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">transport</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
+
+
+<span class="k">class</span> <span class="nc">_Factory</span><span class="p">(</span><span class="n">twisted</span><span class="o">.</span><span class="n">internet</span><span class="o">.</span><span class="n">protocol</span><span class="o">.</span><span class="n">Factory</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;This class creates _Protocol instances for connections to remote nodes.</span>
+
+<span class="sd">  This class is just an implementation detail of the class Node and encapulates</span>
+<span class="sd">  methods to create the _Protocol instances resulting from calls to</span>
+<span class="sd">  Node.connect() and Node.listen().</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="n">protocol</span> <span class="o">=</span> <span class="n">_Protocol</span>
+
+  <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">addNode</span><span class="p">,</span> <span class="n">delNode</span><span class="p">,</span> <span class="n">recvMesg</span><span class="p">):</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">addNode</span> <span class="o">=</span> <span class="n">addNode</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">delNode</span> <span class="o">=</span> <span class="n">delNode</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">recvMesg</span> <span class="o">=</span> <span class="n">recvMesg</span>
+
+
+<span class="k">class</span> <span class="nc">_KnownMgr</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+
+  <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">fire</span><span class="p">):</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__fire</span> <span class="o">=</span> <span class="n">fire</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">DNodes</span><span class="p">()</span>
+
+  <span class="k">def</span> <span class="nf">addNode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
+    <span class="k">if</span> <span class="n">node</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="p">:</span>
+      <span class="k">return</span> <span class="bp">True</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="o">.</span><span class="n">addNode</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__fire</span><span class="p">(</span><span class="s1">&#39;node&#39;</span><span class="p">,</span> <span class="p">{</span><span class="s1">&#39;node&#39;</span><span class="p">:</span> <span class="n">node</span><span class="p">})</span>
+    <span class="k">return</span> <span class="bp">True</span>
+
+  <span class="k">def</span> <span class="nf">delNode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
+    <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="p">:</span>
+      <span class="k">return</span> <span class="bp">True</span>
+
+    <span class="k">for</span> <span class="n">path</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="p">[</span><span class="n">node</span><span class="p">]:</span>
+      <span class="k">for</span> <span class="n">intf</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="p">[</span><span class="n">node</span><span class="p">][</span><span class="n">path</span><span class="p">]:</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">delIntf</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="p">[</span><span class="n">node</span><span class="p">][</span><span class="n">path</span><span class="p">][</span><span class="n">intf</span><span class="p">])</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="o">.</span><span class="n">delNode</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__fire</span><span class="p">(</span><span class="s1">&#39;nodeLost&#39;</span><span class="p">,</span> <span class="p">{</span><span class="s1">&#39;node&#39;</span><span class="p">:</span> <span class="n">node</span><span class="p">})</span>
+    <span class="k">return</span> <span class="bp">True</span>
+
+  <span class="k">def</span> <span class="nf">addIntf</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">interface</span><span class="p">:</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">DInterface</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
+    <span class="c1">#_printArgs(&#39;_KnownMgr.addIntf&#39;, node, path, interface)</span>
+    <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="p">:</span>
+      <span class="k">return</span> <span class="bp">False</span>
+
+    <span class="k">if</span> <span class="n">path</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="p">[</span><span class="n">node</span><span class="p">]:</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="o">.</span><span class="n">addPath</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">)</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__fire</span><span class="p">(</span><span class="s1">&#39;path&#39;</span><span class="p">,</span> <span class="p">{</span><span class="s1">&#39;node&#39;</span><span class="p">:</span> <span class="n">node</span><span class="p">,</span> <span class="s1">&#39;path&#39;</span><span class="p">:</span> <span class="n">path</span><span class="p">})</span>
+
+    <span class="k">if</span> <span class="n">interface</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="p">[</span><span class="n">node</span><span class="p">][</span><span class="n">path</span><span class="p">]:</span>
+      <span class="k">return</span> <span class="bp">True</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="o">.</span><span class="n">addInterface</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">interface</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__fire</span><span class="p">(</span><span class="s1">&#39;intf&#39;</span><span class="p">,</span> <span class="p">{</span><span class="s1">&#39;node&#39;</span><span class="p">:</span> <span class="n">node</span><span class="p">,</span> <span class="s1">&#39;path&#39;</span><span class="p">:</span> <span class="n">path</span><span class="p">,</span> <span class="s1">&#39;intf&#39;</span><span class="p">:</span> <span class="n">interface</span><span class="o">.</span><span class="n">dump</span><span class="p">()})</span>
+    <span class="k">return</span> <span class="bp">True</span>
+
+  <span class="k">def</span> <span class="nf">delIntf</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">interface</span><span class="p">:</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">DInterface</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
+    <span class="c1">#_printArgs(&#39;_KnownMgr.delIntf&#39;, node, path, interface)</span>
+    <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="o">.</span><span class="n">hasIntf</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">interface</span><span class="o">.</span><span class="n">name</span><span class="p">):</span>
+      <span class="k">return</span> <span class="bp">True</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="o">.</span><span class="n">delInterface</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">interface</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__fire</span><span class="p">(</span><span class="s1">&#39;intfLost&#39;</span><span class="p">,</span> <span class="p">{</span><span class="s1">&#39;node&#39;</span><span class="p">:</span> <span class="n">node</span><span class="p">,</span> <span class="s1">&#39;path&#39;</span><span class="p">:</span> <span class="n">path</span><span class="p">,</span> <span class="s1">&#39;intf&#39;</span><span class="p">:</span> <span class="n">interface</span><span class="o">.</span><span class="n">dump</span><span class="p">()})</span>
+
+    <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="p">[</span><span class="n">node</span><span class="p">][</span><span class="n">path</span><span class="p">]:</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="o">.</span><span class="n">delPath</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">)</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__fire</span><span class="p">(</span><span class="s1">&#39;pathLost&#39;</span><span class="p">,</span> <span class="p">{</span><span class="s1">&#39;node&#39;</span><span class="p">:</span> <span class="n">node</span><span class="p">,</span> <span class="s1">&#39;path&#39;</span><span class="p">:</span> <span class="n">path</span><span class="p">})</span>
+
+    <span class="k">return</span> <span class="bp">True</span>
+
+  <span class="k">def</span> <span class="nf">getNode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">DNode</span><span class="p">:</span>
+    <span class="k">if</span> <span class="n">node</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="p">:</span>
+      <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="p">[</span><span class="n">node</span><span class="p">]</span>
+    <span class="k">return</span> <span class="bp">None</span>
+
+  <span class="k">def</span> <span class="nf">setNode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">newNode</span><span class="p">:</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">DNode</span><span class="p">):</span>
+    <span class="c1">#_printArgs(&#39;_KnownMgr.setNode&#39;, newNode.dump())</span>
+    <span class="n">oldNode</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">getNode</span><span class="p">(</span><span class="n">newNode</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+
+    <span class="k">for</span> <span class="n">oldPath</span> <span class="ow">in</span> <span class="n">oldNode</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
+      <span class="k">for</span> <span class="n">oldIntf</span> <span class="ow">in</span> <span class="n">oldPath</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
+        <span class="k">if</span> <span class="ow">not</span> <span class="n">newNode</span><span class="o">.</span><span class="n">hasIntf</span><span class="p">(</span><span class="n">oldPath</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">oldIntf</span><span class="o">.</span><span class="n">name</span><span class="p">):</span>
+          <span class="bp">self</span><span class="o">.</span><span class="n">delIntf</span><span class="p">(</span><span class="n">oldNode</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">oldPath</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">oldIntf</span><span class="p">)</span>
+
+    <span class="k">for</span> <span class="n">newPath</span> <span class="ow">in</span> <span class="n">newNode</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
+      <span class="k">for</span> <span class="n">newIntf</span> <span class="ow">in</span> <span class="n">newPath</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
+        <span class="k">if</span> <span class="ow">not</span> <span class="n">oldNode</span><span class="o">.</span><span class="n">hasIntf</span><span class="p">(</span><span class="n">newPath</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">newIntf</span><span class="o">.</span><span class="n">name</span><span class="p">):</span>
+          <span class="bp">self</span><span class="o">.</span><span class="n">addIntf</span><span class="p">(</span><span class="n">newNode</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">newPath</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">newIntf</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">getNodes</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">DNodes</span><span class="p">:</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span>
+
+
+<span class="k">class</span> <span class="nc">_InformMgr</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+
+  <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__keys</span> <span class="o">=</span> <span class="p">{}</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span> <span class="o">=</span> <span class="p">{}</span>
+
+  <span class="k">def</span> <span class="nf">on</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
+    <span class="n">key</span> <span class="o">=</span> <span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">)</span>
+
+    <span class="k">if</span> <span class="n">key</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="p">:</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="p">[</span><span class="n">key</span><span class="p">][</span><span class="n">node</span><span class="p">]</span> <span class="o">=</span> <span class="bp">True</span>
+
+    <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__keys</span><span class="p">:</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__keys</span><span class="p">[</span><span class="n">node</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__keys</span><span class="p">[</span><span class="n">node</span><span class="p">][</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="bp">True</span>
+
+  <span class="k">def</span> <span class="nf">off</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
+    <span class="n">key</span> <span class="o">=</span> <span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">)</span>
+    <span class="k">if</span> <span class="n">key</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span> <span class="ow">or</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="p">[</span><span class="n">key</span><span class="p">]:</span>
+      <span class="k">return</span>
+
+    <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="p">[</span><span class="n">key</span><span class="p">][</span><span class="n">node</span><span class="p">]</span>
+    <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="p">[</span><span class="n">key</span><span class="p">]:</span>
+      <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
+
+    <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">__keys</span><span class="p">[</span><span class="n">node</span><span class="p">][</span><span class="n">key</span><span class="p">]</span>
+    <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">__keys</span><span class="p">[</span><span class="n">node</span><span class="p">]:</span>
+      <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">__keys</span><span class="p">[</span><span class="n">node</span><span class="p">]</span>
+
+  <span class="k">def</span> <span class="nf">nodes</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
+    <span class="n">key</span> <span class="o">=</span> <span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">)</span>
+    <span class="k">if</span> <span class="n">key</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="p">:</span>
+      <span class="k">return</span> <span class="p">[]</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="p">[</span><span class="n">key</span><span class="p">]</span><span class="o">.</span><span class="n">keys</span><span class="p">()</span>
+
+  <span class="k">def</span> <span class="nf">delNode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
+    <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__keys</span><span class="p">:</span>
+      <span class="k">return</span>
+    <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__keys</span><span class="p">[</span><span class="n">node</span><span class="p">]:</span>
+      <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="p">[</span><span class="n">key</span><span class="p">][</span><span class="n">node</span><span class="p">]</span>
+      <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="p">[</span><span class="n">key</span><span class="p">]:</span>
+        <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">__nodes</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
+    <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">__keys</span><span class="p">[</span><span class="n">node</span><span class="p">]</span>
+
+
+<span class="k">class</span> <span class="nc">_DeferredMgr</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot; This class manages Deferred &quot;&quot;&quot;</span>
+
+  <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__infos</span> <span class="o">=</span> <span class="p">{}</span>
+
+  <span class="k">def</span> <span class="nf">create</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="bp">None</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Creates a Deferred with an info.</span>
+
+<span class="sd">    Args:</span>
+<span class="sd">      data: Some additional data</span>
+
+<span class="sd">    Returns:</span>
+<span class="sd">      (str, defer.Deferred): A Tuple of an unique id and a Deferred</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="n">pid</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">uuid</span><span class="o">.</span><span class="n">uuid4</span><span class="p">())</span>
+
+    <span class="k">def</span> <span class="nf">canceller</span><span class="p">(</span><span class="n">_d</span><span class="p">):</span>
+      <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">__infos</span><span class="p">[</span><span class="n">pid</span><span class="p">]</span>
+
+    <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">(</span><span class="n">canceller</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__infos</span><span class="p">[</span><span class="n">pid</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">d</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
+
+    <span class="k">return</span> <span class="p">(</span><span class="n">pid</span><span class="p">,</span> <span class="n">d</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">succeed</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">pid</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Succeeds the Deferred identified by the given unique id with the given</span>
+<span class="sd">    response.</span>
+
+<span class="sd">    Args:</span>
+<span class="sd">      pid (str): A unique id of a Deferred created with _DeferredMgr.create()</span>
+<span class="sd">      value (mixed): The value to succeed the Deferred with</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">if</span> <span class="n">pid</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__infos</span><span class="p">:</span>
+      <span class="k">return</span>
+
+    <span class="n">d</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__infos</span><span class="p">[</span><span class="n">pid</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
+    <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">__infos</span><span class="p">[</span><span class="n">pid</span><span class="p">]</span>
+    <span class="n">d</span><span class="o">.</span><span class="n">callback</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">fail</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">reason</span><span class="p">,</span> <span class="n">pid</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Fail the Deferred identified by the given unique id with the given</span>
+<span class="sd">    reason.</span>
+
+<span class="sd">    Args:</span>
+<span class="sd">      reason (Exception): The reason to fail the Deferred with</span>
+<span class="sd">      pid (str): A unique id of a Deferred created with _DeferredMgr.create()</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">if</span> <span class="n">pid</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__infos</span><span class="p">:</span>
+      <span class="k">return</span>
+
+    <span class="n">d</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__infos</span><span class="p">[</span><span class="n">pid</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span>
+    <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">__infos</span><span class="p">[</span><span class="n">pid</span><span class="p">]</span>
+    <span class="n">d</span><span class="o">.</span><span class="n">errback</span><span class="p">(</span><span class="n">reason</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">failAll</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">reason</span><span class="p">,</span> <span class="n">predicate</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Fail all Deferred for which predicate(data) returns true.</span>
+
+<span class="sd">    Args:</span>
+<span class="sd">      reason (Exception): The reason to fail the Deferred with</span>
+<span class="sd">      predicate (function): A predicate</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">for</span> <span class="n">pid</span><span class="p">,</span> <span class="n">info</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__infos</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+      <span class="k">if</span> <span class="n">predicate</span><span class="p">(</span><span class="n">pid</span><span class="p">,</span> <span class="n">info</span><span class="p">[</span><span class="mi">1</span><span class="p">]):</span>
+        <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">__infos</span><span class="p">[</span><span class="n">pid</span><span class="p">]</span>
+        <span class="n">info</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">errback</span><span class="p">(</span><span class="n">reason</span><span class="p">)</span>
+
+
+<span class="k">class</span> <span class="nc">_CallbackMgr</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+
+  <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__cbs</span> <span class="o">=</span> <span class="p">{}</span>
+
+  <span class="k">def</span> <span class="nf">on</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">cb</span><span class="p">):</span>
+    <span class="n">first</span> <span class="o">=</span> <span class="bp">False</span>
+    <span class="k">if</span> <span class="n">key</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__cbs</span><span class="p">:</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__cbs</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
+      <span class="n">first</span> <span class="o">=</span> <span class="bp">True</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__cbs</span><span class="p">[</span><span class="n">key</span><span class="p">][</span><span class="nb">id</span><span class="p">(</span><span class="n">cb</span><span class="p">)]</span> <span class="o">=</span> <span class="n">cb</span>
+    <span class="k">return</span> <span class="n">first</span>
+
+  <span class="k">def</span> <span class="nf">off</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">cb</span><span class="p">):</span>
+    <span class="k">if</span> <span class="n">key</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__cbs</span> <span class="ow">or</span> <span class="nb">id</span><span class="p">(</span><span class="n">cb</span><span class="p">)</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__cbs</span><span class="p">[</span><span class="n">key</span><span class="p">]:</span>
+      <span class="k">return</span> <span class="bp">False</span>
+    <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">__cbs</span><span class="p">[</span><span class="n">key</span><span class="p">][</span><span class="nb">id</span><span class="p">(</span><span class="n">cb</span><span class="p">)]</span>
+    <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">__cbs</span><span class="p">[</span><span class="n">key</span><span class="p">]:</span>
+      <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">__cbs</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
+      <span class="k">return</span> <span class="bp">True</span>
+    <span class="k">return</span> <span class="bp">False</span>
+
+  <span class="k">def</span> <span class="nf">fire</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">args</span><span class="p">):</span>
+    <span class="c1">#_printArgs(&#39;_CallbackMgr.fire&#39;, key, args)</span>
+    <span class="k">if</span> <span class="n">key</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__cbs</span><span class="p">:</span>
+      <span class="k">return</span>
+    <span class="k">for</span> <span class="n">cb</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__cbs</span><span class="p">[</span><span class="n">key</span><span class="p">]</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
+      <span class="k">try</span><span class="p">:</span>
+        <span class="n">cb</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span>
+      <span class="k">except</span> <span class="ne">BaseException</span> <span class="k">as</span> <span class="n">_</span><span class="p">:</span>
+        <span class="n">traceback</span><span class="o">.</span><span class="n">print_exc</span><span class="p">()</span>
+
+  <span class="k">def</span> <span class="nf">keys</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">predicate</span><span class="p">):</span>
+    <span class="k">return</span> <span class="p">[</span><span class="n">key</span> <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__cbs</span> <span class="k">if</span> <span class="n">predicate</span><span class="p">(</span><span class="n">key</span><span class="p">)]</span>
+
+
+<span class="k">class</span> <span class="nc">Node</span><span class="p">(</span><span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">Node</span><span class="p">):</span>
+
+  <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+    <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span> <span class="o">=</span> <span class="p">{}</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span> <span class="o">=</span> <span class="p">{}</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__factory</span> <span class="o">=</span> <span class="n">_Factory</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__addNode</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__delNode</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__recvMesg</span><span class="p">)</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__service</span> <span class="o">=</span> <span class="n">twisted</span><span class="o">.</span><span class="n">application</span><span class="o">.</span><span class="n">service</span><span class="o">.</span><span class="n">MultiService</span><span class="p">()</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__service</span><span class="o">.</span><span class="n">startService</span><span class="p">()</span>
+
+    <span class="n">fire</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">:</span> \
+      <span class="bp">self</span><span class="o">.</span><span class="n">__fireEventLocal</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__knownMgr</span> <span class="o">=</span> <span class="n">_KnownMgr</span><span class="p">(</span><span class="n">fire</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__informMgr</span> <span class="o">=</span> <span class="n">_InformMgr</span><span class="p">()</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__callbackMgr</span> <span class="o">=</span> <span class="n">_CallbackMgr</span><span class="p">()</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__deferredMgr</span> <span class="o">=</span> <span class="n">_DeferredMgr</span><span class="p">()</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__knownMgr</span><span class="o">.</span><span class="n">addNode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">connect</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">endpoint</span><span class="p">):</span>
+    <span class="n">service</span> <span class="o">=</span> <span class="n">twisted</span><span class="o">.</span><span class="n">application</span><span class="o">.</span><span class="n">internet</span><span class="o">.</span><span class="n">ClientService</span><span class="p">(</span><span class="n">endpoint</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__factory</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__service</span><span class="o">.</span><span class="n">addService</span><span class="p">(</span><span class="n">service</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">listen</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">endpoint</span><span class="p">):</span>
+    <span class="n">endpoint</span><span class="o">.</span><span class="n">listen</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__factory</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">__addNode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">protocol</span><span class="p">:</span> <span class="n">_Protocol</span><span class="p">):</span>
+    <span class="k">if</span> <span class="n">node</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">:</span>
+      <span class="k">return</span> <span class="bp">False</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">[</span><span class="n">node</span><span class="p">]</span> <span class="o">=</span> <span class="n">protocol</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__knownMgr</span><span class="o">.</span><span class="n">addNode</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>
+
+    <span class="c1"># reestablish existing callbacks by calls to supcon.Remote.on</span>
+    <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbackMgr</span><span class="o">.</span><span class="n">keys</span><span class="p">(</span><span class="k">lambda</span> <span class="n">key</span><span class="p">:</span> <span class="n">key</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="n">node</span><span class="p">):</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__callRemote</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">&#39;on&#39;</span><span class="p">,</span> <span class="p">{</span>
+        <span class="s1">&#39;path&#39;</span><span class="p">:</span> <span class="n">key</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span>
+        <span class="s1">&#39;intf&#39;</span><span class="p">:</span> <span class="n">key</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span>
+        <span class="s1">&#39;event&#39;</span><span class="p">:</span> <span class="n">key</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span>
+      <span class="p">})</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__callRemote</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">&#39;node&#39;</span><span class="p">,</span> <span class="p">{})</span><span class="o">.</span><span class="n">addCallback</span><span class="p">(</span>
+      <span class="k">lambda</span> <span class="n">args</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__knownMgr</span><span class="o">.</span><span class="n">setNode</span><span class="p">(</span><span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">DNode</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="s1">&#39;node&#39;</span><span class="p">]))</span>
+    <span class="p">)</span><span class="o">.</span><span class="n">addErrback</span><span class="p">(</span><span class="n">_printArgs</span><span class="p">)</span>
+
+    <span class="k">return</span> <span class="bp">True</span>
+
+  <span class="k">def</span> <span class="nf">__delNode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
+    <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">:</span>
+      <span class="k">return</span> <span class="bp">False</span>
+    <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">[</span><span class="n">node</span><span class="p">]</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__knownMgr</span><span class="o">.</span><span class="n">delNode</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__informMgr</span><span class="o">.</span><span class="n">delNode</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>
+
+    <span class="n">reason</span> <span class="o">=</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s1">&#39;node {} lost&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+    <span class="n">predicate</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">pid</span><span class="p">,</span> <span class="n">data</span><span class="p">:</span> <span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="n">node</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__deferredMgr</span><span class="o">.</span><span class="n">failAll</span><span class="p">(</span><span class="n">reason</span><span class="p">,</span> <span class="n">predicate</span><span class="p">)</span>
+
+    <span class="k">return</span> <span class="bp">True</span>
+
+  <span class="k">def</span> <span class="nf">nodes</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__knownMgr</span><span class="o">.</span><span class="n">getNodes</span><span class="p">()</span>
+
+  <span class="k">def</span> <span class="nf">register</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">impl</span><span class="p">:</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">Implementation</span><span class="p">):</span>
+    <span class="n">path</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">DPath</span><span class="o">.</span><span class="n">toName</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
+
+    <span class="k">if</span> <span class="n">path</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">:</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
+
+    <span class="k">if</span> <span class="n">impl</span><span class="o">.</span><span class="n">intf</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">]:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;interface {} already registered at path {}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">impl</span><span class="o">.</span><span class="n">intf</span><span class="p">,</span> <span class="n">path</span><span class="p">))</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">][</span><span class="n">impl</span><span class="o">.</span><span class="n">intf</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span>
+      <span class="s1">&#39;impl&#39;</span><span class="p">:</span> <span class="n">impl</span><span class="p">,</span>
+      <span class="s1">&#39;fire&#39;</span><span class="p">:</span> <span class="k">lambda</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__fireImplEvent</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">impl</span><span class="o">.</span><span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+    <span class="p">}</span>
+    <span class="n">impl</span><span class="o">.</span><span class="n">addFireCb</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">][</span><span class="n">impl</span><span class="o">.</span><span class="n">intf</span><span class="p">][</span><span class="s1">&#39;fire&#39;</span><span class="p">])</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__knownMgr</span><span class="o">.</span><span class="n">addIntf</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">impl</span><span class="o">.</span><span class="n">interface</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__broadcastEvent</span><span class="p">(</span><span class="s1">&#39;intf&#39;</span><span class="p">,</span> <span class="p">{</span><span class="s1">&#39;path&#39;</span><span class="p">:</span> <span class="n">path</span><span class="p">,</span> <span class="s1">&#39;intf&#39;</span><span class="p">:</span> <span class="n">impl</span><span class="o">.</span><span class="n">interface</span><span class="o">.</span><span class="n">dump</span><span class="p">()})</span>
+
+  <span class="k">def</span> <span class="nf">unregister</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">impl</span><span class="p">:</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">Implementation</span><span class="p">):</span>
+    <span class="n">path</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">DPath</span><span class="o">.</span><span class="n">toName</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
+
+    <span class="k">if</span> <span class="n">path</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;unknown path {}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">path</span><span class="p">))</span>
+
+    <span class="k">if</span> <span class="n">impl</span><span class="o">.</span><span class="n">intf</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">]:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;unknown interface {} at path {}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">impl</span><span class="o">.</span><span class="n">intf</span><span class="p">,</span> <span class="n">path</span><span class="p">))</span>
+
+    <span class="k">if</span> <span class="n">impl</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">][</span><span class="n">impl</span><span class="o">.</span><span class="n">intf</span><span class="p">][</span><span class="s1">&#39;impl&#39;</span><span class="p">]:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;unknown implementation for interface {} at path {}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">impl</span><span class="o">.</span><span class="n">intf</span><span class="p">,</span> <span class="n">path</span><span class="p">))</span>
+
+    <span class="n">impl</span><span class="o">.</span><span class="n">delFireCb</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">][</span><span class="n">impl</span><span class="o">.</span><span class="n">intf</span><span class="p">][</span><span class="s1">&#39;fire&#39;</span><span class="p">])</span>
+    <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">][</span><span class="n">impl</span><span class="o">.</span><span class="n">intf</span><span class="p">]</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__knownMgr</span><span class="o">.</span><span class="n">delIntf</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">impl</span><span class="o">.</span><span class="n">interface</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__broadcastEvent</span><span class="p">(</span><span class="s1">&#39;intfLost&#39;</span><span class="p">,</span> <span class="p">{</span><span class="s1">&#39;path&#39;</span><span class="p">:</span> <span class="n">path</span><span class="p">,</span> <span class="s1">&#39;intf&#39;</span><span class="p">:</span> <span class="n">impl</span><span class="o">.</span><span class="n">interface</span><span class="o">.</span><span class="n">dump</span><span class="p">()})</span>
+
+  <span class="k">def</span> <span class="nf">on</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">cb</span><span class="p">):</span>
+    <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbackMgr</span><span class="o">.</span><span class="n">on</span><span class="p">((</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">),</span> <span class="n">cb</span><span class="p">):</span>
+      <span class="k">if</span> <span class="n">node</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="ow">and</span> <span class="n">node</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">:</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">__callRemote</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">&#39;on&#39;</span><span class="p">,</span> <span class="p">{</span>
+          <span class="s1">&#39;path&#39;</span><span class="p">:</span> <span class="n">path</span><span class="p">,</span> <span class="s1">&#39;intf&#39;</span><span class="p">:</span> <span class="n">intf</span><span class="p">,</span> <span class="s1">&#39;event&#39;</span><span class="p">:</span> <span class="n">event</span>
+        <span class="p">})</span>
+
+  <span class="k">def</span> <span class="nf">off</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">cb</span><span class="p">):</span>
+    <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbackMgr</span><span class="o">.</span><span class="n">off</span><span class="p">((</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">),</span> <span class="n">cb</span><span class="p">):</span>
+      <span class="k">if</span> <span class="n">node</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="ow">and</span> <span class="n">node</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">:</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">__callRemote</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">&#39;off&#39;</span><span class="p">,</span> <span class="p">{</span>
+          <span class="s1">&#39;path&#39;</span><span class="p">:</span> <span class="n">path</span><span class="p">,</span> <span class="s1">&#39;intf&#39;</span><span class="p">:</span> <span class="n">intf</span><span class="p">,</span> <span class="s1">&#39;event&#39;</span><span class="p">:</span> <span class="n">event</span>
+        <span class="p">})</span>
+
+  <span class="k">def</span> <span class="nf">call</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+    <span class="c1"># TODO: don&#39;t raise Exceptions</span>
+    <span class="k">assert</span> <span class="n">path</span> <span class="o">!=</span> <span class="s1">&#39;/&#39;</span> <span class="ow">or</span> <span class="n">intf</span> <span class="o">!=</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> \
+      <span class="s1">&#39;unable to call: method {} of interface {} at path /&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+
+    <span class="k">if</span> <span class="n">node</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">:</span>
+      <span class="k">if</span> <span class="n">path</span> <span class="o">==</span> <span class="s1">&#39;/&#39;</span> <span class="ow">and</span> <span class="n">intf</span> <span class="o">==</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">:</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callLocal</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+      <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callImpl</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callRemote</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">__callImpl</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+    <span class="c1"># TODO: don&#39;t raise Exception</span>
+    <span class="k">assert</span> <span class="n">path</span> <span class="o">!=</span> <span class="s1">&#39;/&#39;</span> <span class="ow">or</span> <span class="n">intf</span> <span class="o">!=</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> \
+      <span class="s1">&#39;unable to call impl: method {} of interface {} at path /&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+    <span class="k">assert</span> <span class="n">path</span> <span class="o">!=</span> <span class="s1">&#39;/&#39;</span> <span class="ow">or</span> <span class="n">intf</span> <span class="o">!=</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> \
+      <span class="s1">&#39;unable to call impl: method {} of interface {} at path /&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+
+    <span class="k">try</span><span class="p">:</span>
+      <span class="k">if</span> <span class="n">path</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">:</span>
+        <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;unknown path&#39;</span><span class="p">)</span> <span class="c1"># TODO: nicer error message</span>
+      <span class="k">if</span> <span class="n">intf</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">]:</span>
+        <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;unknown intf&#39;</span><span class="p">)</span> <span class="c1"># TODO: nicer error message</span>
+      <span class="k">if</span> <span class="n">method</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">][</span><span class="n">intf</span><span class="p">][</span><span class="s1">&#39;impl&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">interface</span><span class="o">.</span><span class="n">methods</span><span class="p">:</span>
+        <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;unknown method&#39;</span><span class="p">)</span> <span class="c1"># TODO: nicer error message</span>
+
+      <span class="n">d</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">][</span><span class="n">intf</span><span class="p">][</span><span class="s1">&#39;impl&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+      <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">d</span><span class="p">,</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">):</span>
+        <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">succeed</span><span class="p">(</span><span class="n">d</span><span class="p">)</span>
+    <span class="k">except</span> <span class="ne">BaseException</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
+      <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">fail</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
+
+    <span class="k">return</span> <span class="n">d</span>
+
+  <span class="k">def</span> <span class="nf">__callLocal</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+    <span class="c1"># TODO: don&#39;t raise Exception</span>
+    <span class="k">assert</span> <span class="n">method</span> <span class="ow">in</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">methods</span><span class="p">,</span> \
+      <span class="s1">&#39;{} is not an method of interface {} at path /&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+    <span class="n">LocalIntf</span><span class="o">.</span><span class="n">methods</span><span class="p">[</span><span class="n">method</span><span class="p">]</span><span class="o">.</span><span class="n">validateInArgs</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
+
+    <span class="k">if</span> <span class="n">method</span> <span class="o">==</span> <span class="s1">&#39;nodes&#39;</span><span class="p">:</span>
+      <span class="k">return</span> <span class="n">defer</span><span class="o">.</span><span class="n">succeed</span><span class="p">({</span><span class="s1">&#39;nodes&#39;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__knownMgr</span><span class="o">.</span><span class="n">getNodes</span><span class="p">()</span><span class="o">.</span><span class="n">dump</span><span class="p">()})</span>
+
+    <span class="k">return</span> <span class="n">defer</span><span class="o">.</span><span class="n">fail</span><span class="p">(</span><span class="ne">RuntimeError</span><span class="p">(</span><span class="s1">&#39;method {} not yet implemented&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">)))</span>
+
+  <span class="k">def</span> <span class="nf">__callRemote</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+    <span class="c1"># TODO: don&#39;t raise Exception</span>
+    <span class="k">assert</span> <span class="n">path</span> <span class="o">!=</span> <span class="s1">&#39;/&#39;</span> <span class="ow">or</span> <span class="n">intf</span> <span class="o">!=</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> \
+      <span class="s1">&#39;unable to call remote: method {} of interface {} at path /&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+
+    <span class="c1"># TODO: validate args</span>
+
+    <span class="p">(</span><span class="n">cid</span><span class="p">,</span> <span class="n">p</span><span class="p">)</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__deferredMgr</span><span class="o">.</span><span class="n">create</span><span class="p">((</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">method</span><span class="p">))</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__sendCall</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">cid</span><span class="p">)</span>
+    <span class="k">return</span> <span class="n">p</span>
+
+  <span class="k">def</span> <span class="nf">__fireImplEvent</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">):</span>
+    <span class="k">assert</span> <span class="n">path</span> <span class="o">!=</span> <span class="s1">&#39;/&#39;</span> <span class="ow">or</span> <span class="n">intf</span> <span class="o">!=</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> \
+      <span class="s1">&#39;unable to fire impl: event {} of interface {} at path /&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+    <span class="k">assert</span> <span class="n">path</span> <span class="o">!=</span> <span class="s1">&#39;/&#39;</span> <span class="ow">or</span> <span class="n">intf</span> <span class="o">!=</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> \
+      <span class="s1">&#39;unable to fire impl: event {} of interface {} at path /&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__fireEventLocal</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__fireEventRemote</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">__fireEventLocal</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">intf</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">event</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span><span class="p">):</span>
+    <span class="k">assert</span> <span class="n">path</span> <span class="o">!=</span> <span class="s1">&#39;/&#39;</span> <span class="ow">or</span> <span class="n">intf</span> <span class="o">!=</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> \
+      <span class="s1">&#39;unable to fire local: event {} of interface {} at path /&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+    <span class="c1">#_printArgs(&#39;Node.__fireEventLocal&#39;, node, path, intf, event, args)</span>
+
+    <span class="c1"># TODO: validate args</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__callbackMgr</span><span class="o">.</span><span class="n">fire</span><span class="p">((</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">),</span> <span class="n">args</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">__fireEventRemote</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">intf</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">event</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span><span class="p">):</span>
+    <span class="k">assert</span> <span class="n">path</span> <span class="o">!=</span> <span class="s1">&#39;/&#39;</span> <span class="ow">or</span> <span class="n">intf</span> <span class="o">!=</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> \
+      <span class="s1">&#39;unable to fire remote: event {} of interface {} at path /&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+
+    <span class="k">for</span> <span class="n">node</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__informMgr</span><span class="o">.</span><span class="n">nodes</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__sendEvent</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">__broadcastEvent</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span><span class="p">):</span>
+    <span class="k">try</span><span class="p">:</span>
+      <span class="k">assert</span> <span class="n">event</span> <span class="ow">in</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">events</span><span class="p">,</span> \
+        <span class="s1">&#39;{} is not an event of interface {} at path /&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+      <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">events</span><span class="p">[</span><span class="n">event</span><span class="p">]</span><span class="o">.</span><span class="n">validateArgs</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
+    <span class="k">except</span> <span class="ne">BaseException</span> <span class="k">as</span> <span class="n">_</span><span class="p">:</span>
+      <span class="n">traceback</span><span class="o">.</span><span class="n">print_exc</span><span class="p">()</span>
+      <span class="k">return</span>
+
+    <span class="k">for</span> <span class="n">node</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">:</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__sendEvent</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">__recvMesg</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">mesg</span><span class="p">:</span> <span class="nb">dict</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Gets called by _Protocol on new Message&quot;&quot;&quot;</span>
+    <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">:</span>
+      <span class="k">return</span> <span class="bp">False</span>
+
+    <span class="k">if</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">&#39;type&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;call&#39;</span><span class="p">:</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__recvCall</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">&#39;path&#39;</span><span class="p">],</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">&#39;intf&#39;</span><span class="p">],</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">&#39;name&#39;</span><span class="p">],</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">&#39;args&#39;</span><span class="p">],</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">&#39;id&#39;</span><span class="p">])</span>
+    <span class="k">elif</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">&#39;type&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;error&#39;</span><span class="p">:</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__recvError</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">&#39;args&#39;</span><span class="p">],</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">&#39;id&#39;</span><span class="p">])</span>
+    <span class="k">elif</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">&#39;type&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;response&#39;</span><span class="p">:</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__recvResult</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">&#39;args&#39;</span><span class="p">],</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">&#39;id&#39;</span><span class="p">])</span>
+    <span class="k">elif</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">&#39;type&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;event&#39;</span><span class="p">:</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__recvEvent</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">&#39;path&#39;</span><span class="p">],</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">&#39;intf&#39;</span><span class="p">],</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">&#39;name&#39;</span><span class="p">],</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">&#39;args&#39;</span><span class="p">])</span>
+    <span class="k">else</span><span class="p">:</span>
+      <span class="k">return</span> <span class="bp">False</span>
+
+    <span class="k">return</span> <span class="bp">True</span>
+
+  <span class="k">def</span> <span class="nf">__recvCall</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">intf</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">method</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span><span class="p">,</span> <span class="n">cid</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
+    <span class="k">try</span><span class="p">:</span>
+      <span class="k">assert</span> <span class="n">path</span> <span class="o">!=</span> <span class="s1">&#39;/&#39;</span> <span class="ow">or</span> <span class="n">intf</span> <span class="o">!=</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> \
+        <span class="s1">&#39;unable to recv call: method {} of interface {} at path / from node {}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">node</span><span class="p">)</span>
+
+      <span class="k">if</span> <span class="n">path</span> <span class="o">==</span> <span class="s1">&#39;/&#39;</span> <span class="ow">and</span> <span class="n">intf</span> <span class="o">==</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">:</span>
+        <span class="k">assert</span> <span class="n">method</span> <span class="ow">in</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">methods</span><span class="p">,</span> \
+          <span class="s1">&#39;{} is not an method of interface {} at path /&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+        <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">methods</span><span class="p">[</span><span class="n">method</span><span class="p">]</span><span class="o">.</span><span class="n">validateInArgs</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
+
+        <span class="k">if</span> <span class="n">method</span> <span class="o">==</span> <span class="s1">&#39;node&#39;</span><span class="p">:</span>
+          <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">succeed</span><span class="p">({</span><span class="s1">&#39;node&#39;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__knownMgr</span><span class="o">.</span><span class="n">getNode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">)</span><span class="o">.</span><span class="n">dump</span><span class="p">()})</span>
+        <span class="k">elif</span> <span class="n">method</span> <span class="o">==</span> <span class="s1">&#39;on&#39;</span><span class="p">:</span>
+          <span class="bp">self</span><span class="o">.</span><span class="n">__informMgr</span><span class="o">.</span><span class="n">on</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="s1">&#39;path&#39;</span><span class="p">],</span> <span class="n">args</span><span class="p">[</span><span class="s1">&#39;intf&#39;</span><span class="p">],</span> <span class="n">args</span><span class="p">[</span><span class="s1">&#39;event&#39;</span><span class="p">],</span> <span class="n">node</span><span class="p">)</span>
+          <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">succeed</span><span class="p">({})</span>
+        <span class="k">elif</span> <span class="n">method</span> <span class="o">==</span> <span class="s1">&#39;off&#39;</span><span class="p">:</span>
+          <span class="bp">self</span><span class="o">.</span><span class="n">__informMgr</span><span class="o">.</span><span class="n">on</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="s1">&#39;path&#39;</span><span class="p">],</span> <span class="n">args</span><span class="p">[</span><span class="s1">&#39;intf&#39;</span><span class="p">],</span> <span class="n">args</span><span class="p">[</span><span class="s1">&#39;event&#39;</span><span class="p">],</span> <span class="n">node</span><span class="p">)</span>
+          <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">succeed</span><span class="p">({})</span>
+        <span class="k">else</span><span class="p">:</span>
+          <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;method {} is not yet implemented&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">))</span>
+      <span class="k">else</span><span class="p">:</span>
+        <span class="n">d</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callImpl</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+    <span class="k">except</span> <span class="ne">BaseException</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
+      <span class="n">traceback</span><span class="o">.</span><span class="n">print_exc</span><span class="p">()</span>
+      <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">fail</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
+
+    <span class="n">d</span><span class="o">.</span><span class="n">addCallbacks</span><span class="p">(</span>
+      <span class="k">lambda</span> <span class="n">result</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__sendResult</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">result</span><span class="p">,</span> <span class="n">cid</span><span class="p">),</span>
+      <span class="k">lambda</span> <span class="n">reason</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__sendError</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="nb">repr</span><span class="p">(</span><span class="n">reason</span><span class="p">),</span> <span class="n">cid</span><span class="p">)</span>
+    <span class="p">)</span><span class="o">.</span><span class="n">addErrback</span><span class="p">(</span><span class="n">_printArgs</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">__recvError</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">_node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">reason</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">cid</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
+    <span class="k">try</span><span class="p">:</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__deferredMgr</span><span class="o">.</span><span class="n">fail</span><span class="p">(</span><span class="ne">RuntimeError</span><span class="p">(</span><span class="n">reason</span><span class="p">),</span> <span class="n">cid</span><span class="p">)</span>
+    <span class="k">except</span> <span class="ne">BaseException</span> <span class="k">as</span> <span class="n">_</span><span class="p">:</span>
+      <span class="n">traceback</span><span class="o">.</span><span class="n">print_exc</span><span class="p">()</span>
+
+  <span class="k">def</span> <span class="nf">__recvResult</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">_node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">result</span><span class="p">:</span> <span class="nb">dict</span><span class="p">,</span> <span class="n">cid</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
+    <span class="k">try</span><span class="p">:</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__deferredMgr</span><span class="o">.</span><span class="n">succeed</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">cid</span><span class="p">)</span>
+    <span class="k">except</span> <span class="ne">BaseException</span> <span class="k">as</span> <span class="n">_</span><span class="p">:</span>
+      <span class="n">traceback</span><span class="o">.</span><span class="n">print_exc</span><span class="p">()</span>
+
+  <span class="k">def</span> <span class="nf">__recvEvent</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">intf</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">event</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span><span class="p">):</span>
+    <span class="k">try</span><span class="p">:</span>
+      <span class="k">assert</span> <span class="n">path</span> <span class="o">!=</span> <span class="s1">&#39;/&#39;</span> <span class="ow">or</span> <span class="n">intf</span> <span class="o">!=</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> \
+        <span class="s1">&#39;unable to recv event: event {} of interface {} at path /&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+
+      <span class="k">if</span> <span class="n">path</span> <span class="o">==</span> <span class="s1">&#39;/&#39;</span> <span class="ow">and</span> <span class="n">intf</span> <span class="o">==</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">:</span>
+        <span class="k">assert</span> <span class="n">event</span> <span class="ow">in</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">events</span><span class="p">,</span> \
+          <span class="s1">&#39;{} is not an event of interface {} at path /&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+        <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">events</span><span class="p">[</span><span class="n">event</span><span class="p">]</span><span class="o">.</span><span class="n">validateArgs</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
+
+        <span class="bp">self</span><span class="o">.</span><span class="n">__recvEventRemote</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+      <span class="k">else</span><span class="p">:</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">__fireEventLocal</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+    <span class="k">except</span> <span class="ne">BaseException</span> <span class="k">as</span> <span class="n">_</span><span class="p">:</span>
+      <span class="n">traceback</span><span class="o">.</span><span class="n">print_exc</span><span class="p">()</span>
+
+  <span class="k">def</span> <span class="nf">__recvEventRemote</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">):</span>
+    <span class="k">if</span> <span class="n">event</span> <span class="o">==</span> <span class="s1">&#39;intf&#39;</span><span class="p">:</span>
+      <span class="n">path</span> <span class="o">=</span> <span class="n">args</span><span class="p">[</span><span class="s1">&#39;path&#39;</span><span class="p">]</span>
+      <span class="n">interface</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">DInterface</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="s1">&#39;intf&#39;</span><span class="p">])</span>
+
+      <span class="bp">self</span><span class="o">.</span><span class="n">__knownMgr</span><span class="o">.</span><span class="n">addIntf</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">interface</span><span class="p">)</span>
+
+    <span class="k">elif</span> <span class="n">event</span> <span class="o">==</span> <span class="s1">&#39;intfLost&#39;</span><span class="p">:</span>
+      <span class="n">path</span> <span class="o">=</span> <span class="n">args</span><span class="p">[</span><span class="s1">&#39;path&#39;</span><span class="p">]</span>
+      <span class="n">interface</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">DInterface</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="s1">&#39;intf&#39;</span><span class="p">])</span>
+
+      <span class="bp">self</span><span class="o">.</span><span class="n">__knownMgr</span><span class="o">.</span><span class="n">delIntf</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">interface</span><span class="p">)</span>
+
+      <span class="n">reason</span> <span class="o">=</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s1">&#39;interface {} at path {} on node {} lost&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">interface</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+      <span class="n">predicate</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">pid</span><span class="p">,</span> <span class="n">data</span><span class="p">:</span> <span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="n">node</span> <span class="ow">and</span> <span class="n">data</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="n">path</span> <span class="ow">and</span> <span class="n">data</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">==</span> <span class="n">interface</span><span class="o">.</span><span class="n">name</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__deferredMgr</span><span class="o">.</span><span class="n">failAll</span><span class="p">(</span><span class="n">reason</span><span class="p">,</span> <span class="n">predicate</span><span class="p">)</span>
+
+    <span class="k">else</span><span class="p">:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;event {} not yet implemented&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">event</span><span class="p">))</span>
+
+  <span class="k">def</span> <span class="nf">__sendCall</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">intf</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">method</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span><span class="p">,</span> <span class="n">cid</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
+    <span class="k">try</span><span class="p">:</span>
+      <span class="k">assert</span> <span class="n">path</span> <span class="o">!=</span> <span class="s1">&#39;/&#39;</span> <span class="ow">or</span> <span class="n">intf</span> <span class="o">!=</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> \
+        <span class="s1">&#39;unable to send call: method {} of interface {} at path /&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+      <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">:</span>
+        <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s1">&#39;unknown node {}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+
+      <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">[</span><span class="n">node</span><span class="p">]</span><span class="o">.</span><span class="n">sendMesg</span><span class="p">({</span>
+        <span class="s1">&#39;type&#39;</span><span class="p">:</span> <span class="s1">&#39;call&#39;</span><span class="p">,</span>
+        <span class="s1">&#39;path&#39;</span><span class="p">:</span> <span class="n">path</span><span class="p">,</span>
+        <span class="s1">&#39;intf&#39;</span><span class="p">:</span> <span class="n">intf</span><span class="p">,</span>
+        <span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="n">method</span><span class="p">,</span>
+        <span class="s1">&#39;args&#39;</span><span class="p">:</span> <span class="n">args</span><span class="p">,</span>
+        <span class="s1">&#39;id&#39;</span><span class="p">:</span> <span class="n">cid</span>
+      <span class="p">})</span>
+      <span class="k">return</span> <span class="bp">True</span>
+    <span class="k">except</span> <span class="ne">BaseException</span> <span class="k">as</span> <span class="n">_</span><span class="p">:</span>
+      <span class="n">traceback</span><span class="o">.</span><span class="n">print_exc</span><span class="p">()</span>
+      <span class="k">return</span> <span class="bp">False</span>
+
+  <span class="k">def</span> <span class="nf">__sendError</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">reason</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">cid</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
+    <span class="k">try</span><span class="p">:</span>
+      <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">:</span>
+        <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s1">&#39;unknown node {}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+
+      <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">[</span><span class="n">node</span><span class="p">]</span><span class="o">.</span><span class="n">sendMesg</span><span class="p">({</span>
+        <span class="s1">&#39;type&#39;</span><span class="p">:</span> <span class="s1">&#39;error&#39;</span><span class="p">,</span>
+        <span class="s1">&#39;args&#39;</span><span class="p">:</span> <span class="n">reason</span><span class="p">,</span>
+        <span class="s1">&#39;id&#39;</span><span class="p">:</span> <span class="n">cid</span>
+      <span class="p">})</span>
+      <span class="k">return</span> <span class="bp">True</span>
+    <span class="k">except</span> <span class="ne">BaseException</span> <span class="k">as</span> <span class="n">_</span><span class="p">:</span>
+      <span class="n">traceback</span><span class="o">.</span><span class="n">print_exc</span><span class="p">()</span>
+      <span class="k">return</span> <span class="bp">False</span>
+
+  <span class="k">def</span> <span class="nf">__sendResult</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">result</span><span class="p">:</span> <span class="nb">dict</span><span class="p">,</span> <span class="n">cid</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
+    <span class="k">try</span><span class="p">:</span>
+      <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">:</span>
+        <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s1">&#39;unknown node {}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+
+      <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">[</span><span class="n">node</span><span class="p">]</span><span class="o">.</span><span class="n">sendMesg</span><span class="p">({</span>
+        <span class="s1">&#39;type&#39;</span><span class="p">:</span> <span class="s1">&#39;response&#39;</span><span class="p">,</span>
+        <span class="s1">&#39;args&#39;</span><span class="p">:</span> <span class="n">result</span><span class="p">,</span>
+        <span class="s1">&#39;id&#39;</span><span class="p">:</span> <span class="n">cid</span>
+      <span class="p">})</span>
+      <span class="k">return</span> <span class="bp">True</span>
+    <span class="k">except</span> <span class="ne">BaseException</span> <span class="k">as</span> <span class="n">_</span><span class="p">:</span>
+      <span class="n">traceback</span><span class="o">.</span><span class="n">print_exc</span><span class="p">()</span>
+      <span class="k">return</span> <span class="bp">False</span>
+
+  <span class="k">def</span> <span class="nf">__sendEvent</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">intf</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">event</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
+    <span class="k">try</span><span class="p">:</span>
+      <span class="k">assert</span> <span class="n">path</span> <span class="o">!=</span> <span class="s1">&#39;/&#39;</span> <span class="ow">or</span> <span class="n">intf</span> <span class="o">!=</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> \
+        <span class="s1">&#39;unable to send event: event {} of interface {} at path /&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+      <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">:</span>
+        <span class="n">traceback</span><span class="o">.</span><span class="n">print_stack</span><span class="p">()</span>
+        <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s1">&#39;unknown node {}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+
+      <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">[</span><span class="n">node</span><span class="p">]</span><span class="o">.</span><span class="n">sendMesg</span><span class="p">({</span>
+        <span class="s1">&#39;type&#39;</span><span class="p">:</span> <span class="s1">&#39;event&#39;</span><span class="p">,</span>
+        <span class="s1">&#39;path&#39;</span><span class="p">:</span> <span class="n">path</span><span class="p">,</span>
+        <span class="s1">&#39;intf&#39;</span><span class="p">:</span> <span class="n">intf</span><span class="p">,</span>
+        <span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="n">event</span><span class="p">,</span>
+        <span class="s1">&#39;args&#39;</span><span class="p">:</span> <span class="n">args</span>
+      <span class="p">})</span>
+      <span class="k">return</span> <span class="bp">True</span>
+    <span class="k">except</span> <span class="ne">BaseException</span> <span class="k">as</span> <span class="n">_</span><span class="p">:</span>
+      <span class="n">exc_info</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">exc_info</span><span class="p">()</span>
+      <span class="n">traceback</span><span class="o">.</span><span class="n">print_exception</span><span class="p">(</span><span class="o">*</span><span class="n">exc_info</span><span class="p">)</span>
+      <span class="k">return</span> <span class="bp">False</span>
+</pre></div>
+
+  </div>
+
+  </header>
+
+  <section id="section-items">
+    <h2 class="section-title" id="header-variables">Module variables</h2>
+      <div class="item">
+      <p id="supcon.core.LocalIntf" class="name">var <span class="ident">LocalIntf</span></p>
+      
+  
+  <div class="source_cont">
+</div>
+
+      </div>
+      <div class="item">
+      <p id="supcon.core.RemoteIntf" class="name">var <span class="ident">RemoteIntf</span></p>
+      
+  
+  <div class="source_cont">
+</div>
+
+      </div>
+
+
+    <h2 class="section-title" id="header-classes">Classes</h2>
+      
+      <div class="item">
+      <p id="supcon.core.Node" class="name">class <span class="ident">Node</span></p>
+      
+  
+    <div class="desc"><p>The Node Interface. This class defines the methods that participants can
+use to access the supcon bus.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.core.Node', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.core.Node" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">Node</span><span class="p">(</span><span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">Node</span><span class="p">):</span>
+
+  <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+    <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span> <span class="o">=</span> <span class="p">{}</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span> <span class="o">=</span> <span class="p">{}</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__factory</span> <span class="o">=</span> <span class="n">_Factory</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__addNode</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__delNode</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__recvMesg</span><span class="p">)</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__service</span> <span class="o">=</span> <span class="n">twisted</span><span class="o">.</span><span class="n">application</span><span class="o">.</span><span class="n">service</span><span class="o">.</span><span class="n">MultiService</span><span class="p">()</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__service</span><span class="o">.</span><span class="n">startService</span><span class="p">()</span>
+
+    <span class="n">fire</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">:</span> \
+      <span class="bp">self</span><span class="o">.</span><span class="n">__fireEventLocal</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__knownMgr</span> <span class="o">=</span> <span class="n">_KnownMgr</span><span class="p">(</span><span class="n">fire</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__informMgr</span> <span class="o">=</span> <span class="n">_InformMgr</span><span class="p">()</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__callbackMgr</span> <span class="o">=</span> <span class="n">_CallbackMgr</span><span class="p">()</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__deferredMgr</span> <span class="o">=</span> <span class="n">_DeferredMgr</span><span class="p">()</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__knownMgr</span><span class="o">.</span><span class="n">addNode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">connect</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">endpoint</span><span class="p">):</span>
+    <span class="n">service</span> <span class="o">=</span> <span class="n">twisted</span><span class="o">.</span><span class="n">application</span><span class="o">.</span><span class="n">internet</span><span class="o">.</span><span class="n">ClientService</span><span class="p">(</span><span class="n">endpoint</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__factory</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__service</span><span class="o">.</span><span class="n">addService</span><span class="p">(</span><span class="n">service</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">listen</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">endpoint</span><span class="p">):</span>
+    <span class="n">endpoint</span><span class="o">.</span><span class="n">listen</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__factory</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">__addNode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">protocol</span><span class="p">:</span> <span class="n">_Protocol</span><span class="p">):</span>
+    <span class="k">if</span> <span class="n">node</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">:</span>
+      <span class="k">return</span> <span class="bp">False</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">[</span><span class="n">node</span><span class="p">]</span> <span class="o">=</span> <span class="n">protocol</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__knownMgr</span><span class="o">.</span><span class="n">addNode</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>
+
+    <span class="c1"># reestablish existing callbacks by calls to supcon.Remote.on</span>
+    <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbackMgr</span><span class="o">.</span><span class="n">keys</span><span class="p">(</span><span class="k">lambda</span> <span class="n">key</span><span class="p">:</span> <span class="n">key</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="n">node</span><span class="p">):</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__callRemote</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">&#39;on&#39;</span><span class="p">,</span> <span class="p">{</span>
+        <span class="s1">&#39;path&#39;</span><span class="p">:</span> <span class="n">key</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span>
+        <span class="s1">&#39;intf&#39;</span><span class="p">:</span> <span class="n">key</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span>
+        <span class="s1">&#39;event&#39;</span><span class="p">:</span> <span class="n">key</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span>
+      <span class="p">})</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__callRemote</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">&#39;node&#39;</span><span class="p">,</span> <span class="p">{})</span><span class="o">.</span><span class="n">addCallback</span><span class="p">(</span>
+      <span class="k">lambda</span> <span class="n">args</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__knownMgr</span><span class="o">.</span><span class="n">setNode</span><span class="p">(</span><span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">DNode</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="s1">&#39;node&#39;</span><span class="p">]))</span>
+    <span class="p">)</span><span class="o">.</span><span class="n">addErrback</span><span class="p">(</span><span class="n">_printArgs</span><span class="p">)</span>
+
+    <span class="k">return</span> <span class="bp">True</span>
+
+  <span class="k">def</span> <span class="nf">__delNode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
+    <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">:</span>
+      <span class="k">return</span> <span class="bp">False</span>
+    <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">[</span><span class="n">node</span><span class="p">]</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__knownMgr</span><span class="o">.</span><span class="n">delNode</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__informMgr</span><span class="o">.</span><span class="n">delNode</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>
+
+    <span class="n">reason</span> <span class="o">=</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s1">&#39;node {} lost&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+    <span class="n">predicate</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">pid</span><span class="p">,</span> <span class="n">data</span><span class="p">:</span> <span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="n">node</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__deferredMgr</span><span class="o">.</span><span class="n">failAll</span><span class="p">(</span><span class="n">reason</span><span class="p">,</span> <span class="n">predicate</span><span class="p">)</span>
+
+    <span class="k">return</span> <span class="bp">True</span>
+
+  <span class="k">def</span> <span class="nf">nodes</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__knownMgr</span><span class="o">.</span><span class="n">getNodes</span><span class="p">()</span>
+
+  <span class="k">def</span> <span class="nf">register</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">impl</span><span class="p">:</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">Implementation</span><span class="p">):</span>
+    <span class="n">path</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">DPath</span><span class="o">.</span><span class="n">toName</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
+
+    <span class="k">if</span> <span class="n">path</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">:</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
+
+    <span class="k">if</span> <span class="n">impl</span><span class="o">.</span><span class="n">intf</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">]:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;interface {} already registered at path {}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">impl</span><span class="o">.</span><span class="n">intf</span><span class="p">,</span> <span class="n">path</span><span class="p">))</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">][</span><span class="n">impl</span><span class="o">.</span><span class="n">intf</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span>
+      <span class="s1">&#39;impl&#39;</span><span class="p">:</span> <span class="n">impl</span><span class="p">,</span>
+      <span class="s1">&#39;fire&#39;</span><span class="p">:</span> <span class="k">lambda</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__fireImplEvent</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">impl</span><span class="o">.</span><span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+    <span class="p">}</span>
+    <span class="n">impl</span><span class="o">.</span><span class="n">addFireCb</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">][</span><span class="n">impl</span><span class="o">.</span><span class="n">intf</span><span class="p">][</span><span class="s1">&#39;fire&#39;</span><span class="p">])</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__knownMgr</span><span class="o">.</span><span class="n">addIntf</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">impl</span><span class="o">.</span><span class="n">interface</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__broadcastEvent</span><span class="p">(</span><span class="s1">&#39;intf&#39;</span><span class="p">,</span> <span class="p">{</span><span class="s1">&#39;path&#39;</span><span class="p">:</span> <span class="n">path</span><span class="p">,</span> <span class="s1">&#39;intf&#39;</span><span class="p">:</span> <span class="n">impl</span><span class="o">.</span><span class="n">interface</span><span class="o">.</span><span class="n">dump</span><span class="p">()})</span>
+
+  <span class="k">def</span> <span class="nf">unregister</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">impl</span><span class="p">:</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">Implementation</span><span class="p">):</span>
+    <span class="n">path</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">DPath</span><span class="o">.</span><span class="n">toName</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
+
+    <span class="k">if</span> <span class="n">path</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;unknown path {}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">path</span><span class="p">))</span>
+
+    <span class="k">if</span> <span class="n">impl</span><span class="o">.</span><span class="n">intf</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">]:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;unknown interface {} at path {}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">impl</span><span class="o">.</span><span class="n">intf</span><span class="p">,</span> <span class="n">path</span><span class="p">))</span>
+
+    <span class="k">if</span> <span class="n">impl</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">][</span><span class="n">impl</span><span class="o">.</span><span class="n">intf</span><span class="p">][</span><span class="s1">&#39;impl&#39;</span><span class="p">]:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;unknown implementation for interface {} at path {}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">impl</span><span class="o">.</span><span class="n">intf</span><span class="p">,</span> <span class="n">path</span><span class="p">))</span>
+
+    <span class="n">impl</span><span class="o">.</span><span class="n">delFireCb</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">][</span><span class="n">impl</span><span class="o">.</span><span class="n">intf</span><span class="p">][</span><span class="s1">&#39;fire&#39;</span><span class="p">])</span>
+    <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">][</span><span class="n">impl</span><span class="o">.</span><span class="n">intf</span><span class="p">]</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__knownMgr</span><span class="o">.</span><span class="n">delIntf</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">impl</span><span class="o">.</span><span class="n">interface</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__broadcastEvent</span><span class="p">(</span><span class="s1">&#39;intfLost&#39;</span><span class="p">,</span> <span class="p">{</span><span class="s1">&#39;path&#39;</span><span class="p">:</span> <span class="n">path</span><span class="p">,</span> <span class="s1">&#39;intf&#39;</span><span class="p">:</span> <span class="n">impl</span><span class="o">.</span><span class="n">interface</span><span class="o">.</span><span class="n">dump</span><span class="p">()})</span>
+
+  <span class="k">def</span> <span class="nf">on</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">cb</span><span class="p">):</span>
+    <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbackMgr</span><span class="o">.</span><span class="n">on</span><span class="p">((</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">),</span> <span class="n">cb</span><span class="p">):</span>
+      <span class="k">if</span> <span class="n">node</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="ow">and</span> <span class="n">node</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">:</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">__callRemote</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">&#39;on&#39;</span><span class="p">,</span> <span class="p">{</span>
+          <span class="s1">&#39;path&#39;</span><span class="p">:</span> <span class="n">path</span><span class="p">,</span> <span class="s1">&#39;intf&#39;</span><span class="p">:</span> <span class="n">intf</span><span class="p">,</span> <span class="s1">&#39;event&#39;</span><span class="p">:</span> <span class="n">event</span>
+        <span class="p">})</span>
+
+  <span class="k">def</span> <span class="nf">off</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">cb</span><span class="p">):</span>
+    <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbackMgr</span><span class="o">.</span><span class="n">off</span><span class="p">((</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">),</span> <span class="n">cb</span><span class="p">):</span>
+      <span class="k">if</span> <span class="n">node</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="ow">and</span> <span class="n">node</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">:</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">__callRemote</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">&#39;off&#39;</span><span class="p">,</span> <span class="p">{</span>
+          <span class="s1">&#39;path&#39;</span><span class="p">:</span> <span class="n">path</span><span class="p">,</span> <span class="s1">&#39;intf&#39;</span><span class="p">:</span> <span class="n">intf</span><span class="p">,</span> <span class="s1">&#39;event&#39;</span><span class="p">:</span> <span class="n">event</span>
+        <span class="p">})</span>
+
+  <span class="k">def</span> <span class="nf">call</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+    <span class="c1"># TODO: don&#39;t raise Exceptions</span>
+    <span class="k">assert</span> <span class="n">path</span> <span class="o">!=</span> <span class="s1">&#39;/&#39;</span> <span class="ow">or</span> <span class="n">intf</span> <span class="o">!=</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> \
+      <span class="s1">&#39;unable to call: method {} of interface {} at path /&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+
+    <span class="k">if</span> <span class="n">node</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">:</span>
+      <span class="k">if</span> <span class="n">path</span> <span class="o">==</span> <span class="s1">&#39;/&#39;</span> <span class="ow">and</span> <span class="n">intf</span> <span class="o">==</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">:</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callLocal</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+      <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callImpl</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callRemote</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">__callImpl</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+    <span class="c1"># TODO: don&#39;t raise Exception</span>
+    <span class="k">assert</span> <span class="n">path</span> <span class="o">!=</span> <span class="s1">&#39;/&#39;</span> <span class="ow">or</span> <span class="n">intf</span> <span class="o">!=</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> \
+      <span class="s1">&#39;unable to call impl: method {} of interface {} at path /&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+    <span class="k">assert</span> <span class="n">path</span> <span class="o">!=</span> <span class="s1">&#39;/&#39;</span> <span class="ow">or</span> <span class="n">intf</span> <span class="o">!=</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> \
+      <span class="s1">&#39;unable to call impl: method {} of interface {} at path /&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+
+    <span class="k">try</span><span class="p">:</span>
+      <span class="k">if</span> <span class="n">path</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">:</span>
+        <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;unknown path&#39;</span><span class="p">)</span> <span class="c1"># TODO: nicer error message</span>
+      <span class="k">if</span> <span class="n">intf</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">]:</span>
+        <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;unknown intf&#39;</span><span class="p">)</span> <span class="c1"># TODO: nicer error message</span>
+      <span class="k">if</span> <span class="n">method</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">][</span><span class="n">intf</span><span class="p">][</span><span class="s1">&#39;impl&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">interface</span><span class="o">.</span><span class="n">methods</span><span class="p">:</span>
+        <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;unknown method&#39;</span><span class="p">)</span> <span class="c1"># TODO: nicer error message</span>
+
+      <span class="n">d</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">][</span><span class="n">intf</span><span class="p">][</span><span class="s1">&#39;impl&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+      <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">d</span><span class="p">,</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">):</span>
+        <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">succeed</span><span class="p">(</span><span class="n">d</span><span class="p">)</span>
+    <span class="k">except</span> <span class="ne">BaseException</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
+      <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">fail</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
+
+    <span class="k">return</span> <span class="n">d</span>
+
+  <span class="k">def</span> <span class="nf">__callLocal</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+    <span class="c1"># TODO: don&#39;t raise Exception</span>
+    <span class="k">assert</span> <span class="n">method</span> <span class="ow">in</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">methods</span><span class="p">,</span> \
+      <span class="s1">&#39;{} is not an method of interface {} at path /&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+    <span class="n">LocalIntf</span><span class="o">.</span><span class="n">methods</span><span class="p">[</span><span class="n">method</span><span class="p">]</span><span class="o">.</span><span class="n">validateInArgs</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
+
+    <span class="k">if</span> <span class="n">method</span> <span class="o">==</span> <span class="s1">&#39;nodes&#39;</span><span class="p">:</span>
+      <span class="k">return</span> <span class="n">defer</span><span class="o">.</span><span class="n">succeed</span><span class="p">({</span><span class="s1">&#39;nodes&#39;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__knownMgr</span><span class="o">.</span><span class="n">getNodes</span><span class="p">()</span><span class="o">.</span><span class="n">dump</span><span class="p">()})</span>
+
+    <span class="k">return</span> <span class="n">defer</span><span class="o">.</span><span class="n">fail</span><span class="p">(</span><span class="ne">RuntimeError</span><span class="p">(</span><span class="s1">&#39;method {} not yet implemented&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">)))</span>
+
+  <span class="k">def</span> <span class="nf">__callRemote</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+    <span class="c1"># TODO: don&#39;t raise Exception</span>
+    <span class="k">assert</span> <span class="n">path</span> <span class="o">!=</span> <span class="s1">&#39;/&#39;</span> <span class="ow">or</span> <span class="n">intf</span> <span class="o">!=</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> \
+      <span class="s1">&#39;unable to call remote: method {} of interface {} at path /&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+
+    <span class="c1"># TODO: validate args</span>
+
+    <span class="p">(</span><span class="n">cid</span><span class="p">,</span> <span class="n">p</span><span class="p">)</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__deferredMgr</span><span class="o">.</span><span class="n">create</span><span class="p">((</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">method</span><span class="p">))</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__sendCall</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">cid</span><span class="p">)</span>
+    <span class="k">return</span> <span class="n">p</span>
+
+  <span class="k">def</span> <span class="nf">__fireImplEvent</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">):</span>
+    <span class="k">assert</span> <span class="n">path</span> <span class="o">!=</span> <span class="s1">&#39;/&#39;</span> <span class="ow">or</span> <span class="n">intf</span> <span class="o">!=</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> \
+      <span class="s1">&#39;unable to fire impl: event {} of interface {} at path /&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+    <span class="k">assert</span> <span class="n">path</span> <span class="o">!=</span> <span class="s1">&#39;/&#39;</span> <span class="ow">or</span> <span class="n">intf</span> <span class="o">!=</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> \
+      <span class="s1">&#39;unable to fire impl: event {} of interface {} at path /&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__fireEventLocal</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__fireEventRemote</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">__fireEventLocal</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">intf</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">event</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span><span class="p">):</span>
+    <span class="k">assert</span> <span class="n">path</span> <span class="o">!=</span> <span class="s1">&#39;/&#39;</span> <span class="ow">or</span> <span class="n">intf</span> <span class="o">!=</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> \
+      <span class="s1">&#39;unable to fire local: event {} of interface {} at path /&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+    <span class="c1">#_printArgs(&#39;Node.__fireEventLocal&#39;, node, path, intf, event, args)</span>
+
+    <span class="c1"># TODO: validate args</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__callbackMgr</span><span class="o">.</span><span class="n">fire</span><span class="p">((</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">),</span> <span class="n">args</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">__fireEventRemote</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">intf</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">event</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span><span class="p">):</span>
+    <span class="k">assert</span> <span class="n">path</span> <span class="o">!=</span> <span class="s1">&#39;/&#39;</span> <span class="ow">or</span> <span class="n">intf</span> <span class="o">!=</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> \
+      <span class="s1">&#39;unable to fire remote: event {} of interface {} at path /&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+
+    <span class="k">for</span> <span class="n">node</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__informMgr</span><span class="o">.</span><span class="n">nodes</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__sendEvent</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">__broadcastEvent</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span><span class="p">):</span>
+    <span class="k">try</span><span class="p">:</span>
+      <span class="k">assert</span> <span class="n">event</span> <span class="ow">in</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">events</span><span class="p">,</span> \
+        <span class="s1">&#39;{} is not an event of interface {} at path /&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+      <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">events</span><span class="p">[</span><span class="n">event</span><span class="p">]</span><span class="o">.</span><span class="n">validateArgs</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
+    <span class="k">except</span> <span class="ne">BaseException</span> <span class="k">as</span> <span class="n">_</span><span class="p">:</span>
+      <span class="n">traceback</span><span class="o">.</span><span class="n">print_exc</span><span class="p">()</span>
+      <span class="k">return</span>
+
+    <span class="k">for</span> <span class="n">node</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">:</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__sendEvent</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">__recvMesg</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">mesg</span><span class="p">:</span> <span class="nb">dict</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Gets called by _Protocol on new Message&quot;&quot;&quot;</span>
+    <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">:</span>
+      <span class="k">return</span> <span class="bp">False</span>
+
+    <span class="k">if</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">&#39;type&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;call&#39;</span><span class="p">:</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__recvCall</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">&#39;path&#39;</span><span class="p">],</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">&#39;intf&#39;</span><span class="p">],</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">&#39;name&#39;</span><span class="p">],</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">&#39;args&#39;</span><span class="p">],</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">&#39;id&#39;</span><span class="p">])</span>
+    <span class="k">elif</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">&#39;type&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;error&#39;</span><span class="p">:</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__recvError</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">&#39;args&#39;</span><span class="p">],</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">&#39;id&#39;</span><span class="p">])</span>
+    <span class="k">elif</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">&#39;type&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;response&#39;</span><span class="p">:</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__recvResult</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">&#39;args&#39;</span><span class="p">],</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">&#39;id&#39;</span><span class="p">])</span>
+    <span class="k">elif</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">&#39;type&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;event&#39;</span><span class="p">:</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__recvEvent</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">&#39;path&#39;</span><span class="p">],</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">&#39;intf&#39;</span><span class="p">],</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">&#39;name&#39;</span><span class="p">],</span> <span class="n">mesg</span><span class="p">[</span><span class="s1">&#39;args&#39;</span><span class="p">])</span>
+    <span class="k">else</span><span class="p">:</span>
+      <span class="k">return</span> <span class="bp">False</span>
+
+    <span class="k">return</span> <span class="bp">True</span>
+
+  <span class="k">def</span> <span class="nf">__recvCall</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">intf</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">method</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span><span class="p">,</span> <span class="n">cid</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
+    <span class="k">try</span><span class="p">:</span>
+      <span class="k">assert</span> <span class="n">path</span> <span class="o">!=</span> <span class="s1">&#39;/&#39;</span> <span class="ow">or</span> <span class="n">intf</span> <span class="o">!=</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> \
+        <span class="s1">&#39;unable to recv call: method {} of interface {} at path / from node {}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">node</span><span class="p">)</span>
+
+      <span class="k">if</span> <span class="n">path</span> <span class="o">==</span> <span class="s1">&#39;/&#39;</span> <span class="ow">and</span> <span class="n">intf</span> <span class="o">==</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">:</span>
+        <span class="k">assert</span> <span class="n">method</span> <span class="ow">in</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">methods</span><span class="p">,</span> \
+          <span class="s1">&#39;{} is not an method of interface {} at path /&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+        <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">methods</span><span class="p">[</span><span class="n">method</span><span class="p">]</span><span class="o">.</span><span class="n">validateInArgs</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
+
+        <span class="k">if</span> <span class="n">method</span> <span class="o">==</span> <span class="s1">&#39;node&#39;</span><span class="p">:</span>
+          <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">succeed</span><span class="p">({</span><span class="s1">&#39;node&#39;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__knownMgr</span><span class="o">.</span><span class="n">getNode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">)</span><span class="o">.</span><span class="n">dump</span><span class="p">()})</span>
+        <span class="k">elif</span> <span class="n">method</span> <span class="o">==</span> <span class="s1">&#39;on&#39;</span><span class="p">:</span>
+          <span class="bp">self</span><span class="o">.</span><span class="n">__informMgr</span><span class="o">.</span><span class="n">on</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="s1">&#39;path&#39;</span><span class="p">],</span> <span class="n">args</span><span class="p">[</span><span class="s1">&#39;intf&#39;</span><span class="p">],</span> <span class="n">args</span><span class="p">[</span><span class="s1">&#39;event&#39;</span><span class="p">],</span> <span class="n">node</span><span class="p">)</span>
+          <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">succeed</span><span class="p">({})</span>
+        <span class="k">elif</span> <span class="n">method</span> <span class="o">==</span> <span class="s1">&#39;off&#39;</span><span class="p">:</span>
+          <span class="bp">self</span><span class="o">.</span><span class="n">__informMgr</span><span class="o">.</span><span class="n">on</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="s1">&#39;path&#39;</span><span class="p">],</span> <span class="n">args</span><span class="p">[</span><span class="s1">&#39;intf&#39;</span><span class="p">],</span> <span class="n">args</span><span class="p">[</span><span class="s1">&#39;event&#39;</span><span class="p">],</span> <span class="n">node</span><span class="p">)</span>
+          <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">succeed</span><span class="p">({})</span>
+        <span class="k">else</span><span class="p">:</span>
+          <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;method {} is not yet implemented&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">))</span>
+      <span class="k">else</span><span class="p">:</span>
+        <span class="n">d</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callImpl</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+    <span class="k">except</span> <span class="ne">BaseException</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
+      <span class="n">traceback</span><span class="o">.</span><span class="n">print_exc</span><span class="p">()</span>
+      <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">fail</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
+
+    <span class="n">d</span><span class="o">.</span><span class="n">addCallbacks</span><span class="p">(</span>
+      <span class="k">lambda</span> <span class="n">result</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__sendResult</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">result</span><span class="p">,</span> <span class="n">cid</span><span class="p">),</span>
+      <span class="k">lambda</span> <span class="n">reason</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__sendError</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="nb">repr</span><span class="p">(</span><span class="n">reason</span><span class="p">),</span> <span class="n">cid</span><span class="p">)</span>
+    <span class="p">)</span><span class="o">.</span><span class="n">addErrback</span><span class="p">(</span><span class="n">_printArgs</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">__recvError</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">_node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">reason</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">cid</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
+    <span class="k">try</span><span class="p">:</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__deferredMgr</span><span class="o">.</span><span class="n">fail</span><span class="p">(</span><span class="ne">RuntimeError</span><span class="p">(</span><span class="n">reason</span><span class="p">),</span> <span class="n">cid</span><span class="p">)</span>
+    <span class="k">except</span> <span class="ne">BaseException</span> <span class="k">as</span> <span class="n">_</span><span class="p">:</span>
+      <span class="n">traceback</span><span class="o">.</span><span class="n">print_exc</span><span class="p">()</span>
+
+  <span class="k">def</span> <span class="nf">__recvResult</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">_node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">result</span><span class="p">:</span> <span class="nb">dict</span><span class="p">,</span> <span class="n">cid</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
+    <span class="k">try</span><span class="p">:</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__deferredMgr</span><span class="o">.</span><span class="n">succeed</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">cid</span><span class="p">)</span>
+    <span class="k">except</span> <span class="ne">BaseException</span> <span class="k">as</span> <span class="n">_</span><span class="p">:</span>
+      <span class="n">traceback</span><span class="o">.</span><span class="n">print_exc</span><span class="p">()</span>
+
+  <span class="k">def</span> <span class="nf">__recvEvent</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">intf</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">event</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span><span class="p">):</span>
+    <span class="k">try</span><span class="p">:</span>
+      <span class="k">assert</span> <span class="n">path</span> <span class="o">!=</span> <span class="s1">&#39;/&#39;</span> <span class="ow">or</span> <span class="n">intf</span> <span class="o">!=</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> \
+        <span class="s1">&#39;unable to recv event: event {} of interface {} at path /&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+
+      <span class="k">if</span> <span class="n">path</span> <span class="o">==</span> <span class="s1">&#39;/&#39;</span> <span class="ow">and</span> <span class="n">intf</span> <span class="o">==</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">:</span>
+        <span class="k">assert</span> <span class="n">event</span> <span class="ow">in</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">events</span><span class="p">,</span> \
+          <span class="s1">&#39;{} is not an event of interface {} at path /&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+        <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">events</span><span class="p">[</span><span class="n">event</span><span class="p">]</span><span class="o">.</span><span class="n">validateArgs</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
+
+        <span class="bp">self</span><span class="o">.</span><span class="n">__recvEventRemote</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+      <span class="k">else</span><span class="p">:</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">__fireEventLocal</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+    <span class="k">except</span> <span class="ne">BaseException</span> <span class="k">as</span> <span class="n">_</span><span class="p">:</span>
+      <span class="n">traceback</span><span class="o">.</span><span class="n">print_exc</span><span class="p">()</span>
+
+  <span class="k">def</span> <span class="nf">__recvEventRemote</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">):</span>
+    <span class="k">if</span> <span class="n">event</span> <span class="o">==</span> <span class="s1">&#39;intf&#39;</span><span class="p">:</span>
+      <span class="n">path</span> <span class="o">=</span> <span class="n">args</span><span class="p">[</span><span class="s1">&#39;path&#39;</span><span class="p">]</span>
+      <span class="n">interface</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">DInterface</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="s1">&#39;intf&#39;</span><span class="p">])</span>
+
+      <span class="bp">self</span><span class="o">.</span><span class="n">__knownMgr</span><span class="o">.</span><span class="n">addIntf</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">interface</span><span class="p">)</span>
+
+    <span class="k">elif</span> <span class="n">event</span> <span class="o">==</span> <span class="s1">&#39;intfLost&#39;</span><span class="p">:</span>
+      <span class="n">path</span> <span class="o">=</span> <span class="n">args</span><span class="p">[</span><span class="s1">&#39;path&#39;</span><span class="p">]</span>
+      <span class="n">interface</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">DInterface</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="s1">&#39;intf&#39;</span><span class="p">])</span>
+
+      <span class="bp">self</span><span class="o">.</span><span class="n">__knownMgr</span><span class="o">.</span><span class="n">delIntf</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">interface</span><span class="p">)</span>
+
+      <span class="n">reason</span> <span class="o">=</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s1">&#39;interface {} at path {} on node {} lost&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">interface</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+      <span class="n">predicate</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">pid</span><span class="p">,</span> <span class="n">data</span><span class="p">:</span> <span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="n">node</span> <span class="ow">and</span> <span class="n">data</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="n">path</span> <span class="ow">and</span> <span class="n">data</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">==</span> <span class="n">interface</span><span class="o">.</span><span class="n">name</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__deferredMgr</span><span class="o">.</span><span class="n">failAll</span><span class="p">(</span><span class="n">reason</span><span class="p">,</span> <span class="n">predicate</span><span class="p">)</span>
+
+    <span class="k">else</span><span class="p">:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;event {} not yet implemented&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">event</span><span class="p">))</span>
+
+  <span class="k">def</span> <span class="nf">__sendCall</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">intf</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">method</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span><span class="p">,</span> <span class="n">cid</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
+    <span class="k">try</span><span class="p">:</span>
+      <span class="k">assert</span> <span class="n">path</span> <span class="o">!=</span> <span class="s1">&#39;/&#39;</span> <span class="ow">or</span> <span class="n">intf</span> <span class="o">!=</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> \
+        <span class="s1">&#39;unable to send call: method {} of interface {} at path /&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+      <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">:</span>
+        <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s1">&#39;unknown node {}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+
+      <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">[</span><span class="n">node</span><span class="p">]</span><span class="o">.</span><span class="n">sendMesg</span><span class="p">({</span>
+        <span class="s1">&#39;type&#39;</span><span class="p">:</span> <span class="s1">&#39;call&#39;</span><span class="p">,</span>
+        <span class="s1">&#39;path&#39;</span><span class="p">:</span> <span class="n">path</span><span class="p">,</span>
+        <span class="s1">&#39;intf&#39;</span><span class="p">:</span> <span class="n">intf</span><span class="p">,</span>
+        <span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="n">method</span><span class="p">,</span>
+        <span class="s1">&#39;args&#39;</span><span class="p">:</span> <span class="n">args</span><span class="p">,</span>
+        <span class="s1">&#39;id&#39;</span><span class="p">:</span> <span class="n">cid</span>
+      <span class="p">})</span>
+      <span class="k">return</span> <span class="bp">True</span>
+    <span class="k">except</span> <span class="ne">BaseException</span> <span class="k">as</span> <span class="n">_</span><span class="p">:</span>
+      <span class="n">traceback</span><span class="o">.</span><span class="n">print_exc</span><span class="p">()</span>
+      <span class="k">return</span> <span class="bp">False</span>
+
+  <span class="k">def</span> <span class="nf">__sendError</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">reason</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">cid</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
+    <span class="k">try</span><span class="p">:</span>
+      <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">:</span>
+        <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s1">&#39;unknown node {}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+
+      <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">[</span><span class="n">node</span><span class="p">]</span><span class="o">.</span><span class="n">sendMesg</span><span class="p">({</span>
+        <span class="s1">&#39;type&#39;</span><span class="p">:</span> <span class="s1">&#39;error&#39;</span><span class="p">,</span>
+        <span class="s1">&#39;args&#39;</span><span class="p">:</span> <span class="n">reason</span><span class="p">,</span>
+        <span class="s1">&#39;id&#39;</span><span class="p">:</span> <span class="n">cid</span>
+      <span class="p">})</span>
+      <span class="k">return</span> <span class="bp">True</span>
+    <span class="k">except</span> <span class="ne">BaseException</span> <span class="k">as</span> <span class="n">_</span><span class="p">:</span>
+      <span class="n">traceback</span><span class="o">.</span><span class="n">print_exc</span><span class="p">()</span>
+      <span class="k">return</span> <span class="bp">False</span>
+
+  <span class="k">def</span> <span class="nf">__sendResult</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">result</span><span class="p">:</span> <span class="nb">dict</span><span class="p">,</span> <span class="n">cid</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
+    <span class="k">try</span><span class="p">:</span>
+      <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">:</span>
+        <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s1">&#39;unknown node {}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+
+      <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">[</span><span class="n">node</span><span class="p">]</span><span class="o">.</span><span class="n">sendMesg</span><span class="p">({</span>
+        <span class="s1">&#39;type&#39;</span><span class="p">:</span> <span class="s1">&#39;response&#39;</span><span class="p">,</span>
+        <span class="s1">&#39;args&#39;</span><span class="p">:</span> <span class="n">result</span><span class="p">,</span>
+        <span class="s1">&#39;id&#39;</span><span class="p">:</span> <span class="n">cid</span>
+      <span class="p">})</span>
+      <span class="k">return</span> <span class="bp">True</span>
+    <span class="k">except</span> <span class="ne">BaseException</span> <span class="k">as</span> <span class="n">_</span><span class="p">:</span>
+      <span class="n">traceback</span><span class="o">.</span><span class="n">print_exc</span><span class="p">()</span>
+      <span class="k">return</span> <span class="bp">False</span>
+
+  <span class="k">def</span> <span class="nf">__sendEvent</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">intf</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">event</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
+    <span class="k">try</span><span class="p">:</span>
+      <span class="k">assert</span> <span class="n">path</span> <span class="o">!=</span> <span class="s1">&#39;/&#39;</span> <span class="ow">or</span> <span class="n">intf</span> <span class="o">!=</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> \
+        <span class="s1">&#39;unable to send event: event {} of interface {} at path /&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+      <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">:</span>
+        <span class="n">traceback</span><span class="o">.</span><span class="n">print_stack</span><span class="p">()</span>
+        <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s1">&#39;unknown node {}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+
+      <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">[</span><span class="n">node</span><span class="p">]</span><span class="o">.</span><span class="n">sendMesg</span><span class="p">({</span>
+        <span class="s1">&#39;type&#39;</span><span class="p">:</span> <span class="s1">&#39;event&#39;</span><span class="p">,</span>
+        <span class="s1">&#39;path&#39;</span><span class="p">:</span> <span class="n">path</span><span class="p">,</span>
+        <span class="s1">&#39;intf&#39;</span><span class="p">:</span> <span class="n">intf</span><span class="p">,</span>
+        <span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="n">event</span><span class="p">,</span>
+        <span class="s1">&#39;args&#39;</span><span class="p">:</span> <span class="n">args</span>
+      <span class="p">})</span>
+      <span class="k">return</span> <span class="bp">True</span>
+    <span class="k">except</span> <span class="ne">BaseException</span> <span class="k">as</span> <span class="n">_</span><span class="p">:</span>
+      <span class="n">exc_info</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">exc_info</span><span class="p">()</span>
+      <span class="n">traceback</span><span class="o">.</span><span class="n">print_exception</span><span class="p">(</span><span class="o">*</span><span class="n">exc_info</span><span class="p">)</span>
+      <span class="k">return</span> <span class="bp">False</span>
+</pre></div>
+
+  </div>
+</div>
+
+
+      <div class="class">
+          <h3>Ancestors (in MRO)</h3>
+          <ul class="class_list">
+          <li><a href="/screwerk/supcon/core.m.md#supcon.core.Node">Node</a></li>
+          <li>supcon.intf.Node</li>
+          <li>abc.ABC</li>
+          <li>builtins.object</li>
+          </ul>
+          <h3>Class Methods</h3>
+            
+  <div class="item">
+    <div class="name def" id="supcon.core.Node.toName">
+    <p>def <span class="ident">toName</span>(</p><p>cls, value)</p>
+    </div>
+    
+
+    
+  
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.core.Node.toName', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.core.Node.toName" class="source">
+    <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">toName</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
+  <span class="k">return</span> <span class="n">DNode</span><span class="o">.</span><span class="n">toName</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+          <h3>Instance variables</h3>
+            <div class="item">
+            <p id="supcon.core.Node.name" class="name">var <span class="ident">name</span></p>
+            
+
+            
+  
+    <div class="desc"><p>str: The name of the node on the bus</p></div>
+  <div class="source_cont">
+</div>
+
+            </div>
+          <h3>Methods</h3>
+            
+  <div class="item">
+    <div class="name def" id="supcon.core.Node.__init__">
+    <p>def <span class="ident">__init__</span>(</p><p>self, name)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Initialize self.  See help(type(self)) for accurate signature.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.core.Node.__init__', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.core.Node.__init__" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+  <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span> <span class="o">=</span> <span class="p">{}</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span> <span class="o">=</span> <span class="p">{}</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__factory</span> <span class="o">=</span> <span class="n">_Factory</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__addNode</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__delNode</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__recvMesg</span><span class="p">)</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__service</span> <span class="o">=</span> <span class="n">twisted</span><span class="o">.</span><span class="n">application</span><span class="o">.</span><span class="n">service</span><span class="o">.</span><span class="n">MultiService</span><span class="p">()</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__service</span><span class="o">.</span><span class="n">startService</span><span class="p">()</span>
+  <span class="n">fire</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">:</span> \
+    <span class="bp">self</span><span class="o">.</span><span class="n">__fireEventLocal</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__knownMgr</span> <span class="o">=</span> <span class="n">_KnownMgr</span><span class="p">(</span><span class="n">fire</span><span class="p">)</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__informMgr</span> <span class="o">=</span> <span class="n">_InformMgr</span><span class="p">()</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__callbackMgr</span> <span class="o">=</span> <span class="n">_CallbackMgr</span><span class="p">()</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__deferredMgr</span> <span class="o">=</span> <span class="n">_DeferredMgr</span><span class="p">()</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__knownMgr</span><span class="o">.</span><span class="n">addNode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.core.Node.call">
+    <p>def <span class="ident">call</span>(</p><p>self, node, path, intf, method, args)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Calls a method on the bus</p>
+<p>Args:
+  node (str): a node on the bus
+  path (str): a path on the given node
+  intf (str): an interface at the given path
+  method (str): a method of the given interface
+  args (dict): a dict of method arguments</p>
+<p>Returns:
+  defer.Deferred:</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.core.Node.call', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.core.Node.call" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">call</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+  <span class="c1"># TODO: don&#39;t raise Exceptions</span>
+  <span class="k">assert</span> <span class="n">path</span> <span class="o">!=</span> <span class="s1">&#39;/&#39;</span> <span class="ow">or</span> <span class="n">intf</span> <span class="o">!=</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> \
+    <span class="s1">&#39;unable to call: method {} of interface {} at path /&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+  <span class="k">if</span> <span class="n">node</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">:</span>
+    <span class="k">if</span> <span class="n">path</span> <span class="o">==</span> <span class="s1">&#39;/&#39;</span> <span class="ow">and</span> <span class="n">intf</span> <span class="o">==</span> <span class="n">LocalIntf</span><span class="o">.</span><span class="n">name</span><span class="p">:</span>
+      <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callLocal</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callImpl</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+  <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callRemote</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.core.Node.connect">
+    <p>def <span class="ident">connect</span>(</p><p>self, endpoint)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Connects the node to the given endpoint.</p>
+<p>If the connection failes or closes the connection gets reestablished with an
+exponential timeout up to two minutes.</p>
+<p>Args:
+  endpoint (twisted.internet.interfaces.IStreamClientEndpoint):</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.core.Node.connect', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.core.Node.connect" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">connect</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">endpoint</span><span class="p">):</span>
+  <span class="n">service</span> <span class="o">=</span> <span class="n">twisted</span><span class="o">.</span><span class="n">application</span><span class="o">.</span><span class="n">internet</span><span class="o">.</span><span class="n">ClientService</span><span class="p">(</span><span class="n">endpoint</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__factory</span><span class="p">)</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__service</span><span class="o">.</span><span class="n">addService</span><span class="p">(</span><span class="n">service</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.core.Node.listen">
+    <p>def <span class="ident">listen</span>(</p><p>self, endpoint)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Listens at the given endpoint for incoming connections</p>
+<p>Args:
+  endpoint (twisted.internet.interfaces.IStreamServerEndpoint):</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.core.Node.listen', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.core.Node.listen" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">listen</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">endpoint</span><span class="p">):</span>
+  <span class="n">endpoint</span><span class="o">.</span><span class="n">listen</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__factory</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.core.Node.nodes">
+    <p>def <span class="ident">nodes</span>(</p><p>self)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>list[str]: The currently connected nodes</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.core.Node.nodes', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.core.Node.nodes" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">nodes</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+  <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__knownMgr</span><span class="o">.</span><span class="n">getNodes</span><span class="p">()</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.core.Node.off">
+    <p>def <span class="ident">off</span>(</p><p>self, node, path, intf, event, cb)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Unregisters a callback for an event on the bus</p>
+<p>Args:
+  node (str): a node on the bus
+  path (str): a path on the given node
+  intf (str): an interface at the given path
+  event (str): a method of the given interface
+  cb (callable): a callable that gets called with a dict of event arguments</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.core.Node.off', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.core.Node.off" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">off</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">cb</span><span class="p">):</span>
+  <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbackMgr</span><span class="o">.</span><span class="n">off</span><span class="p">((</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">),</span> <span class="n">cb</span><span class="p">):</span>
+    <span class="k">if</span> <span class="n">node</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="ow">and</span> <span class="n">node</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">:</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__callRemote</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">&#39;off&#39;</span><span class="p">,</span> <span class="p">{</span>
+        <span class="s1">&#39;path&#39;</span><span class="p">:</span> <span class="n">path</span><span class="p">,</span> <span class="s1">&#39;intf&#39;</span><span class="p">:</span> <span class="n">intf</span><span class="p">,</span> <span class="s1">&#39;event&#39;</span><span class="p">:</span> <span class="n">event</span>
+      <span class="p">})</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.core.Node.on">
+    <p>def <span class="ident">on</span>(</p><p>self, node, path, intf, event, cb)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Registers a callback for an event on the bus</p>
+<p>Args:
+  node (str): a node on the bus
+  path (str): a path on the given node
+  intf (str): an interface at the given path
+  event (str): a method of the given interface
+  cb (callable): a callable that gets called with a dict of event arguments</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.core.Node.on', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.core.Node.on" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">on</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">cb</span><span class="p">):</span>
+  <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbackMgr</span><span class="o">.</span><span class="n">on</span><span class="p">((</span><span class="n">node</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">),</span> <span class="n">cb</span><span class="p">):</span>
+    <span class="k">if</span> <span class="n">node</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="ow">and</span> <span class="n">node</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__protocols</span><span class="p">:</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__callRemote</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="n">RemoteIntf</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">&#39;on&#39;</span><span class="p">,</span> <span class="p">{</span>
+        <span class="s1">&#39;path&#39;</span><span class="p">:</span> <span class="n">path</span><span class="p">,</span> <span class="s1">&#39;intf&#39;</span><span class="p">:</span> <span class="n">intf</span><span class="p">,</span> <span class="s1">&#39;event&#39;</span><span class="p">:</span> <span class="n">event</span>
+      <span class="p">})</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.core.Node.register">
+    <p>def <span class="ident">register</span>(</p><p>self, path, impl)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Registers an implementation with the node</p>
+<p>Args:
+  impl (Implementation):</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.core.Node.register', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.core.Node.register" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">register</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">impl</span><span class="p">:</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">Implementation</span><span class="p">):</span>
+  <span class="n">path</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">DPath</span><span class="o">.</span><span class="n">toName</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
+  <span class="k">if</span> <span class="n">path</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">:</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
+  <span class="k">if</span> <span class="n">impl</span><span class="o">.</span><span class="n">intf</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">]:</span>
+    <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;interface {} already registered at path {}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">impl</span><span class="o">.</span><span class="n">intf</span><span class="p">,</span> <span class="n">path</span><span class="p">))</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">][</span><span class="n">impl</span><span class="o">.</span><span class="n">intf</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span>
+    <span class="s1">&#39;impl&#39;</span><span class="p">:</span> <span class="n">impl</span><span class="p">,</span>
+    <span class="s1">&#39;fire&#39;</span><span class="p">:</span> <span class="k">lambda</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__fireImplEvent</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">impl</span><span class="o">.</span><span class="n">intf</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+  <span class="p">}</span>
+  <span class="n">impl</span><span class="o">.</span><span class="n">addFireCb</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">][</span><span class="n">impl</span><span class="o">.</span><span class="n">intf</span><span class="p">][</span><span class="s1">&#39;fire&#39;</span><span class="p">])</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__knownMgr</span><span class="o">.</span><span class="n">addIntf</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">impl</span><span class="o">.</span><span class="n">interface</span><span class="p">)</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__broadcastEvent</span><span class="p">(</span><span class="s1">&#39;intf&#39;</span><span class="p">,</span> <span class="p">{</span><span class="s1">&#39;path&#39;</span><span class="p">:</span> <span class="n">path</span><span class="p">,</span> <span class="s1">&#39;intf&#39;</span><span class="p">:</span> <span class="n">impl</span><span class="o">.</span><span class="n">interface</span><span class="o">.</span><span class="n">dump</span><span class="p">()})</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.core.Node.unregister">
+    <p>def <span class="ident">unregister</span>(</p><p>self, path, impl)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Removes an implementation from the node</p>
+<p>Args:
+  impl (supcon.intf.Implementation):</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.core.Node.unregister', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.core.Node.unregister" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">unregister</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">impl</span><span class="p">:</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">Implementation</span><span class="p">):</span>
+  <span class="n">path</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">DPath</span><span class="o">.</span><span class="n">toName</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
+  <span class="k">if</span> <span class="n">path</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">:</span>
+    <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;unknown path {}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">path</span><span class="p">))</span>
+  <span class="k">if</span> <span class="n">impl</span><span class="o">.</span><span class="n">intf</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">]:</span>
+    <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;unknown interface {} at path {}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">impl</span><span class="o">.</span><span class="n">intf</span><span class="p">,</span> <span class="n">path</span><span class="p">))</span>
+  <span class="k">if</span> <span class="n">impl</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">][</span><span class="n">impl</span><span class="o">.</span><span class="n">intf</span><span class="p">][</span><span class="s1">&#39;impl&#39;</span><span class="p">]:</span>
+    <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;unknown implementation for interface {} at path {}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">impl</span><span class="o">.</span><span class="n">intf</span><span class="p">,</span> <span class="n">path</span><span class="p">))</span>
+  <span class="n">impl</span><span class="o">.</span><span class="n">delFireCb</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">][</span><span class="n">impl</span><span class="o">.</span><span class="n">intf</span><span class="p">][</span><span class="s1">&#39;fire&#39;</span><span class="p">])</span>
+  <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">path</span><span class="p">][</span><span class="n">impl</span><span class="o">.</span><span class="n">intf</span><span class="p">]</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__knownMgr</span><span class="o">.</span><span class="n">delIntf</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">impl</span><span class="o">.</span><span class="n">interface</span><span class="p">)</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__broadcastEvent</span><span class="p">(</span><span class="s1">&#39;intfLost&#39;</span><span class="p">,</span> <span class="p">{</span><span class="s1">&#39;path&#39;</span><span class="p">:</span> <span class="n">path</span><span class="p">,</span> <span class="s1">&#39;intf&#39;</span><span class="p">:</span> <span class="n">impl</span><span class="o">.</span><span class="n">interface</span><span class="o">.</span><span class="n">dump</span><span class="p">()})</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+      </div>
+      </div>
+
+  </section>
+
+    </article>
+</div>
diff --git a/doc/index.md b/doc/index.md
new file mode 100644 (file)
index 0000000..829a807
--- /dev/null
@@ -0,0 +1,648 @@
+<link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,300' rel='stylesheet' type='text/css'>
+
+
+<style type="text/css">
+
+  .CONTENT {
+    padding: 0;
+  }
+
+  #container {
+    display: flex;
+    flex-directtion: column;
+  }
+
+  #content {
+    padding: 30px;
+    border-left: 1px solid #ddd;
+  }
+  #sidebar {
+    padding: 30px;
+  }
+
+  #footer {
+    font-size: .75em;
+    padding: 5px 30px;
+    border-top: 1px solid #ddd;
+    text-align: right;
+  }
+  #footer p {
+    margin: 0 0 0 30px;
+    display: inline-block;
+  }
+
+  h1, h2, h3, h4, h5 {
+    font-weight: 300;
+  }
+  h1 {
+    font-size: 2.5em;
+    line-height: 1.1em;
+    margin: 0 0 .50em 0;
+  }
+
+  h2 {
+    font-size: 1.75em;
+    margin: 1em 0 .50em 0;
+  }
+
+  h3 {
+    margin: 25px 0 10px 0;
+  }
+
+  h4 {
+    margin: 0;
+    font-size: 105%;
+  }
+
+  a {
+    color: #058;
+    text-decoration: none;
+    transition: color .3s ease-in-out;
+  }
+
+  a:hover {
+    color: #e08524;
+    transition: color .3s ease-in-out;
+  }
+
+  pre, code, .mono, .name {
+    font-family: "Ubuntu Mono", "Cousine", "DejaVu Sans Mono", monospace;
+  }
+
+  .title .name {
+    font-weight: bold;
+  }
+  .section-title {
+    margin-top: 2em;
+  }
+  .ident {
+    color: #900;
+  }
+
+  code {
+    background: #f9f9f9;
+  } 
+
+  pre {
+    background: #fefefe;
+    border: 1px solid #ddd;
+    box-shadow: 2px 2px 0 #f3f3f3;
+    margin: 0 30px;
+    padding: 15px 30px;
+  }
+
+  .codehilite {
+    margin: 0 30px 10px 30px;
+  }
+
+    .codehilite pre {
+      margin: 0;
+    }
+    .codehilite .err { background: #ff3300; color: #fff !important; } 
+
+  table#module-list {
+    font-size: 110%;
+  }
+
+    table#module-list tr td:first-child {
+      padding-right: 10px;
+      white-space: nowrap;
+    }
+
+    table#module-list td {
+      vertical-align: top;
+      padding-bottom: 8px;
+    }
+
+      table#module-list td p {
+        margin: 0 0 7px 0;
+      }
+
+  .def {
+    display: table;
+  }
+
+    .def p {
+      display: table-cell;
+      vertical-align: top;
+      text-align: left;
+    }
+
+    .def p:first-child {
+      white-space: nowrap;
+    }
+
+    .def p:last-child {
+      width: 100%;
+    }
+
+
+  #index {
+    list-style-type: none;
+    margin: 0;
+    padding: 0;
+  }
+    ul#index .class_name {
+      /* font-size: 110%; */
+      font-weight: bold;
+    }
+    #index ul {
+      margin: 0;
+    }
+
+  .item {
+    margin: 0 0 15px 0;
+  }
+
+    .item .class {
+      margin: 0 0 25px 30px;
+    }
+
+      .item .class ul.class_list {
+        margin: 0 0 20px 0;
+      }
+
+    .item .name {
+      background: #fafafa;
+      margin: 0;
+      font-weight: bold;
+      padding: 5px 10px;
+      border-radius: 3px;
+      display: inline-block;
+      min-width: 40%;
+    }
+      .item .name:hover {
+        background: #f6f6f6;
+      }
+
+    .item .empty_desc {
+      margin: 0 0 5px 0;
+      padding: 0;
+    }
+
+    .item .inheritance {
+      margin: 3px 0 0 30px;
+    }
+
+    .item .inherited {
+      color: #666;
+    }
+
+    .item .desc {
+      padding: 0 8px;
+      margin: 0;
+    }
+
+      .item .desc p {
+        margin: 0 0 10px 0;
+      }
+
+    .source_cont {
+      margin: 0;
+      padding: 0;
+    }
+
+    .source_link a {
+      background: #ffc300;
+      font-weight: 400;
+      font-size: .75em;
+      text-transform: uppercase;
+      color: #fff;
+      text-shadow: 1px 1px 0 #f4b700;
+      
+      padding: 3px 8px;
+      border-radius: 2px;
+      transition: background .3s ease-in-out;
+    }
+      .source_link a:hover {
+        background: #FF7200;
+        text-shadow: none;
+        transition: background .3s ease-in-out;
+      }
+
+    .source {
+      display: none;
+      max-height: 600px;
+      overflow-y: scroll;
+      margin-bottom: 15px;
+    }
+
+      .source .codehilite {
+        margin: 0;
+      }
+
+  .desc h1, .desc h2, .desc h3 {
+    font-size: 100% !important;
+  }
+  .clear {
+    clear: both;
+  }
+
+  @media all and (max-width: 950px) {
+    #sidebar {
+      width: 35%;
+    }
+    #content {
+      width: 65%;
+    }
+  }
+  @media all and (max-width: 650px) {
+    #top {
+      display: none;
+    }
+    #sidebar {
+      float: none;
+      width: auto;
+    }
+    #content {
+      float: none;
+      width: auto;
+      padding: 30px;
+    }
+
+    #index ul {
+      padding: 0;
+      margin-bottom: 15px;
+    }
+    #index ul li {
+      display: inline-block;
+      margin-right: 30px;
+    }
+    #footer {
+      text-align: left;
+    }
+    #footer p {
+      display: block;
+      margin: inherit;
+    }
+  }
+
+  /*****************************/
+
+</style>
+
+<style type="text/css">
+.codehilite .hll { background-color: #ffffcc }
+.codehilite  { background: #f8f8f8; }
+.codehilite .c { color: #408080; font-style: italic } /* Comment */
+.codehilite .err { border: 1px solid #FF0000 } /* Error */
+.codehilite .k { color: #008000; font-weight: bold } /* Keyword */
+.codehilite .o { color: #666666 } /* Operator */
+.codehilite .ch { color: #408080; font-style: italic } /* Comment.Hashbang */
+.codehilite .cm { color: #408080; font-style: italic } /* Comment.Multiline */
+.codehilite .cp { color: #BC7A00 } /* Comment.Preproc */
+.codehilite .cpf { color: #408080; font-style: italic } /* Comment.PreprocFile */
+.codehilite .c1 { color: #408080; font-style: italic } /* Comment.Single */
+.codehilite .cs { color: #408080; font-style: italic } /* Comment.Special */
+.codehilite .gd { color: #A00000 } /* Generic.Deleted */
+.codehilite .ge { font-style: italic } /* Generic.Emph */
+.codehilite .gr { color: #FF0000 } /* Generic.Error */
+.codehilite .gh { color: #000080; font-weight: bold } /* Generic.Heading */
+.codehilite .gi { color: #00A000 } /* Generic.Inserted */
+.codehilite .go { color: #888888 } /* Generic.Output */
+.codehilite .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
+.codehilite .gs { font-weight: bold } /* Generic.Strong */
+.codehilite .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
+.codehilite .gt { color: #0044DD } /* Generic.Traceback */
+.codehilite .kc { color: #008000; font-weight: bold } /* Keyword.Constant */
+.codehilite .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
+.codehilite .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
+.codehilite .kp { color: #008000 } /* Keyword.Pseudo */
+.codehilite .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
+.codehilite .kt { color: #B00040 } /* Keyword.Type */
+.codehilite .m { color: #666666 } /* Literal.Number */
+.codehilite .s { color: #BA2121 } /* Literal.String */
+.codehilite .na { color: #7D9029 } /* Name.Attribute */
+.codehilite .nb { color: #008000 } /* Name.Builtin */
+.codehilite .nc { color: #0000FF; font-weight: bold } /* Name.Class */
+.codehilite .no { color: #880000 } /* Name.Constant */
+.codehilite .nd { color: #AA22FF } /* Name.Decorator */
+.codehilite .ni { color: #999999; font-weight: bold } /* Name.Entity */
+.codehilite .ne { color: #D2413A; font-weight: bold } /* Name.Exception */
+.codehilite .nf { color: #0000FF } /* Name.Function */
+.codehilite .nl { color: #A0A000 } /* Name.Label */
+.codehilite .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
+.codehilite .nt { color: #008000; font-weight: bold } /* Name.Tag */
+.codehilite .nv { color: #19177C } /* Name.Variable */
+.codehilite .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
+.codehilite .w { color: #bbbbbb } /* Text.Whitespace */
+.codehilite .mb { color: #666666 } /* Literal.Number.Bin */
+.codehilite .mf { color: #666666 } /* Literal.Number.Float */
+.codehilite .mh { color: #666666 } /* Literal.Number.Hex */
+.codehilite .mi { color: #666666 } /* Literal.Number.Integer */
+.codehilite .mo { color: #666666 } /* Literal.Number.Oct */
+.codehilite .sa { color: #BA2121 } /* Literal.String.Affix */
+.codehilite .sb { color: #BA2121 } /* Literal.String.Backtick */
+.codehilite .sc { color: #BA2121 } /* Literal.String.Char */
+.codehilite .dl { color: #BA2121 } /* Literal.String.Delimiter */
+.codehilite .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
+.codehilite .s2 { color: #BA2121 } /* Literal.String.Double */
+.codehilite .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */
+.codehilite .sh { color: #BA2121 } /* Literal.String.Heredoc */
+.codehilite .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */
+.codehilite .sx { color: #008000 } /* Literal.String.Other */
+.codehilite .sr { color: #BB6688 } /* Literal.String.Regex */
+.codehilite .s1 { color: #BA2121 } /* Literal.String.Single */
+.codehilite .ss { color: #19177C } /* Literal.String.Symbol */
+.codehilite .bp { color: #008000 } /* Name.Builtin.Pseudo */
+.codehilite .fm { color: #0000FF } /* Name.Function.Magic */
+.codehilite .vc { color: #19177C } /* Name.Variable.Class */
+.codehilite .vg { color: #19177C } /* Name.Variable.Global */
+.codehilite .vi { color: #19177C } /* Name.Variable.Instance */
+.codehilite .vm { color: #19177C } /* Name.Variable.Magic */
+.codehilite .il { color: #666666 } /* Literal.Number.Integer.Long */
+</style>
+
+<script type="text/javascript">
+function toggle(id, $link) {
+  $node = document.getElementById(id);
+  if (!$node) return;
+  if (!$node.style.display || $node.style.display == 'none') {
+    $node.style.display = 'block';
+    $link.innerHTML = 'Hide source &nequiv;';
+  } else {
+    $node.style.display = 'none';
+    $link.innerHTML = 'Show source &equiv;';
+  }
+}
+</script>
+
+<div id="container">
+    
+  
+  <div id="sidebar">
+    <a href="/screwerk/supcon">Doc</a>
+
+    <h1>Index</h1>
+    <ul id="index">
+
+
+
+    <li class="set"><h3><a href="/screwerk/supcon/index.md#header-submodules">Sub-modules</a></h3>
+      <ul>
+        <li class="mono"><a href="/screwerk/supcon/clone.m.md">supcon.clone</a></li>
+        <li class="mono"><a href="/screwerk/supcon/core.m.md">supcon.core</a></li>
+        <li class="mono"><a href="/screwerk/supcon/intf.m.md">supcon.intf</a></li>
+        <li class="mono"><a href="/screwerk/supcon/keyed.m.md">supcon.keyed</a></li>
+        <li class="mono"><a href="/screwerk/supcon/store.m.md">supcon.store</a></li>
+        <li class="mono"><a href="/screwerk/supcon/switch.m.md">supcon.switch</a></li>
+        <li class="mono"><a href="/screwerk/supcon/util.m.md">supcon.util</a></li>
+      </ul>
+    </li>
+    </ul>
+  </div>
+
+    <article id="content">
+      
+  
+
+  
+
+
+  <header id="section-intro">
+  <h1 class="title"><span class="name">supcon</span> module</h1>
+  <p>The <code>supcon</code> Framework provides inter-process communication (IPC) and remote
+procedure call (RPC) mechanisms, that allow communication between multiple
+computer programs running on different hosts in a TCP/IP network.</p>
+<p>Each participating program exposes one or more <a href="/screwerk/supcon/intf.m.md#supcon.intf.Node"><code>supcon.intf.Node</code></a>s to the
+network. Each <a href="/screwerk/supcon/intf.m.md#supcon.intf.Node"><code>supcon.intf.Node</code></a> has a name that must be unique among the
+nodes of the communicating programs.</p>
+<div class="codehilite"><pre><span></span><span class="kn">import</span> <span class="nn">supcon.core</span>
+
+<span class="n">lServer</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">core</span><span class="o">.</span><span class="n">Node</span><span class="p">(</span><span class="s1">&#39;my-unique-server&#39;</span><span class="p">)</span>
+<span class="n">lClient</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">core</span><span class="o">.</span><span class="n">Node</span><span class="p">(</span><span class="s1">&#39;my-unique-client&#39;</span><span class="p">)</span>
+</pre></div>
+
+
+<p>You can give a <a href="/screwerk/supcon/intf.m.md#supcon.intf.Node"><code>supcon.intf.Node</code></a> one or more endpoints on the network to either
+connect to or to listen for incomming connections.</p>
+<div class="codehilite"><pre><span></span><span class="kn">from</span> <span class="nn">twisted.internet</span> <span class="kn">import</span> <span class="n">reactor</span>
+<span class="kn">from</span> <span class="nn">twisted.internet.endpoints</span> <span class="kn">import</span> <span class="n">TCP4ClientEndpoint</span>
+<span class="kn">from</span> <span class="nn">twisted.internet.endpoints</span> <span class="kn">import</span> <span class="n">TCP4ServerEndpoint</span>
+
+<span class="n">lServer</span><span class="o">.</span><span class="n">listen</span><span class="p">(</span><span class="n">TCP4ServerEndpoint</span><span class="p">(</span><span class="n">reactor</span><span class="p">,</span> <span class="mi">7000</span><span class="p">))</span>
+<span class="n">lClient</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">TCP4ClientEndpoint</span><span class="p">(</span><span class="n">reactor</span><span class="p">,</span> <span class="s1">&#39;localhost&#39;</span><span class="p">,</span> <span class="mi">7000</span><span class="p">))</span>
+</pre></div>
+
+
+<p>When a <a href="/screwerk/supcon/intf.m.md#supcon.intf.Node"><code>supcon.intf.Node</code></a> is unable to create a connection to the given endpoint
+or an established connection terminates, the node tries to reestablish the
+connection.</p>
+<p>Programs can expose events and provide methods via the node. These events and
+methods are defined in <code>supcon.intf.Interface</code>s. Lets create one:</p>
+<div class="codehilite"><pre><span></span><span class="kn">import</span> <span class="nn">supcon.intf</span>
+
+<span class="n">timerIntf</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">Interface</span><span class="p">({</span>
+  <span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="s1">&#39;com.example.Timer&#39;</span><span class="p">,</span>
+  <span class="s1">&#39;events&#39;</span><span class="p">:</span> <span class="p">[</span>
+    <span class="p">{</span>
+      <span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="s1">&#39;timeout&#39;</span><span class="p">,</span>
+      <span class="s1">&#39;args&#39;</span><span class="p">:</span> <span class="p">[</span>
+        <span class="p">{</span> <span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="s1">&#39;timer&#39;</span><span class="p">,</span> <span class="s1">&#39;description&#39;</span><span class="p">:</span> <span class="s1">&#39;(str) - The name of the timer&#39;</span> <span class="p">}</span>
+      <span class="p">]</span>
+      <span class="s1">&#39;description&#39;</span><span class="p">:</span> <span class="s1">&#39;Gets triggerd, whenever a timer times out.&#39;</span>
+    <span class="p">}</span>
+  <span class="p">],</span>
+  <span class="s1">&#39;methods&#39;</span><span class="p">:</span> <span class="p">[</span>
+    <span class="p">{</span>
+      <span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="s1">&#39;add&#39;</span><span class="p">,</span>
+      <span class="s1">&#39;inArgs&#39;</span><span class="p">:</span> <span class="p">[</span>
+        <span class="p">{</span> <span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="s1">&#39;timer&#39;</span><span class="p">,</span> <span class="s1">&#39;description&#39;</span><span class="p">:</span> <span class="s1">&#39;(str) - A name for the timer&#39;</span> <span class="p">}</span>
+        <span class="p">{</span> <span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="s1">&#39;seconds&#39;</span><span class="p">,</span> <span class="s1">&#39;description&#39;</span><span class="p">:</span> <span class="s1">&#39;(float) - A duration&#39;</span> <span class="p">}</span>
+      <span class="p">],</span>
+      <span class="s1">&#39;description&#39;</span><span class="p">:</span> <span class="s1">&#39;Adds a new timer.&#39;</span>
+    <span class="p">}</span>
+  <span class="p">]</span>
+<span class="p">})</span>
+</pre></div>
+
+
+<p>Lets implement the interface and register the implementation at the local node:</p>
+<div class="codehilite"><pre><span></span><span class="n">timerImpl</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">Implementation</span><span class="p">(</span><span class="n">timerIntf</span><span class="p">)</span>
+
+<span class="k">def</span> <span class="nf">fireTimeout</span><span class="p">(</span><span class="n">timer</span><span class="p">):</span>
+  <span class="n">timerImpl</span><span class="o">.</span><span class="n">fire</span><span class="p">(</span><span class="s1">&#39;timeout&#39;</span><span class="p">,</span> <span class="p">{</span> <span class="s1">&#39;timer&#39;</span><span class="p">:</span> <span class="n">timer</span> <span class="p">})</span>
+
+<span class="k">def</span> <span class="nf">onAdd</span><span class="p">(</span><span class="n">timer</span><span class="p">,</span> <span class="n">seconds</span><span class="p">):</span>
+  <span class="n">reactor</span><span class="o">.</span><span class="n">callLater</span><span class="p">(</span><span class="n">seconds</span><span class="p">,</span> <span class="k">lambda</span><span class="p">:</span> <span class="n">fireTimeout</span><span class="p">(</span><span class="n">timer</span><span class="p">))</span>
+
+<span class="n">timerImpl</span><span class="o">.</span><span class="n">setCallCb</span><span class="p">(</span><span class="s1">&#39;add&#39;</span><span class="p">,</span> <span class="n">onAdd</span><span class="p">)</span>
+
+<span class="n">lServer</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="s1">&#39;/myTimer&#39;</span><span class="p">,</span> <span class="n">timerImpl</span><span class="p">)</span>
+</pre></div>
+
+
+<p>Now you can watch for timeout events and add a timer via the
+<code>lClient</code> reference:</p>
+<div class="codehilite"><pre><span></span><span class="n">lClient</span><span class="o">.</span><span class="n">on</span><span class="p">(</span><span class="s1">&#39;my-unique-server&#39;</span><span class="p">,</span> <span class="s1">&#39;/myTimer&#39;</span><span class="p">,</span> <span class="s1">&#39;com.example.Timer&#39;</span><span class="p">,</span> <span class="s1">&#39;timeout&#39;</span><span class="p">,</span> 
+  <span class="k">lambda</span> <span class="o">*</span><span class="n">args</span><span class="p">:</span> <span class="k">print</span><span class="p">(</span><span class="s1">&#39;, &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span> <span class="s1">&#39;{}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">args</span> <span class="p">]))</span>
+<span class="p">)</span>
+
+<span class="n">lClient</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="s1">&#39;my-unique-server&#39;</span><span class="p">,</span> <span class="s1">&#39;/myTimer&#39;</span><span class="p">,</span> <span class="s1">&#39;com.example.Timer&#39;</span><span class="p">,</span> <span class="s1">&#39;add&#39;</span><span class="p">,</span> <span class="p">{</span>
+  <span class="s1">&#39;timer&#39;</span><span class="p">:</span> <span class="s1">&#39;5Seconds&#39;</span><span class="p">,</span> <span class="s1">&#39;seconds&#39;</span><span class="p">:</span> <span class="mi">5</span>
+<span class="p">})</span>
+</pre></div>
+
+
+<p>And don't forget to start the reactor (aka event loop)</p>
+<div class="codehilite"><pre><span></span><span class="n">reactor</span><span class="o">.</span><span class="n">run</span><span class="p">()</span>
+</pre></div>
+  
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon', this);">Show source &equiv;</a></p>
+  <div id="source-supcon" class="source">
+    <div class="codehilite"><pre><span></span><span class="c1"># -*- coding: utf-8 -*-</span>
+<span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">The `supcon` Framework provides inter-process communication (IPC) and remote</span>
+<span class="sd">procedure call (RPC) mechanisms, that allow communication between multiple</span>
+<span class="sd">computer programs running on different hosts in a TCP/IP network.</span>
+
+<span class="sd">Each participating program exposes one or more `supcon.intf.Node`s to the</span>
+<span class="sd">network. Each `supcon.intf.Node` has a name that must be unique among the</span>
+<span class="sd">nodes of the communicating programs.</span>
+
+<span class="sd">    #!python</span>
+<span class="sd">    import supcon.core</span>
+<span class="sd">    </span>
+<span class="sd">    lServer = supcon.core.Node(&#39;my-unique-server&#39;)</span>
+<span class="sd">    lClient = supcon.core.Node(&#39;my-unique-client&#39;)</span>
+
+<span class="sd">You can give a `supcon.intf.Node` one or more endpoints on the network to either</span>
+<span class="sd">connect to or to listen for incomming connections.</span>
+
+<span class="sd">    #!python</span>
+<span class="sd">    from twisted.internet import reactor</span>
+<span class="sd">    from twisted.internet.endpoints import TCP4ClientEndpoint</span>
+<span class="sd">    from twisted.internet.endpoints import TCP4ServerEndpoint</span>
+
+<span class="sd">    lServer.listen(TCP4ServerEndpoint(reactor, 7000))</span>
+<span class="sd">    lClient.connect(TCP4ClientEndpoint(reactor, &#39;localhost&#39;, 7000))</span>
+
+<span class="sd">When a `supcon.intf.Node` is unable to create a connection to the given endpoint</span>
+<span class="sd">or an established connection terminates, the node tries to reestablish the</span>
+<span class="sd">connection.</span>
+
+<span class="sd">Programs can expose events and provide methods via the node. These events and</span>
+<span class="sd">methods are defined in `supcon.intf.Interface`s. Lets create one:</span>
+
+<span class="sd">    #!python</span>
+<span class="sd">    import supcon.intf</span>
+
+<span class="sd">    timerIntf = supcon.intf.Interface({</span>
+<span class="sd">      &#39;name&#39;: &#39;com.example.Timer&#39;,</span>
+<span class="sd">      &#39;events&#39;: [</span>
+<span class="sd">        {</span>
+<span class="sd">          &#39;name&#39;: &#39;timeout&#39;,</span>
+<span class="sd">          &#39;args&#39;: [</span>
+<span class="sd">            { &#39;name&#39;: &#39;timer&#39;, &#39;description&#39;: &#39;(str) - The name of the timer&#39; }</span>
+<span class="sd">          ]</span>
+<span class="sd">          &#39;description&#39;: &#39;Gets triggerd, whenever a timer times out.&#39;</span>
+<span class="sd">        }</span>
+<span class="sd">      ],</span>
+<span class="sd">      &#39;methods&#39;: [</span>
+<span class="sd">        {</span>
+<span class="sd">          &#39;name&#39;: &#39;add&#39;,</span>
+<span class="sd">          &#39;inArgs&#39;: [</span>
+<span class="sd">            { &#39;name&#39;: &#39;timer&#39;, &#39;description&#39;: &#39;(str) - A name for the timer&#39; }</span>
+<span class="sd">            { &#39;name&#39;: &#39;seconds&#39;, &#39;description&#39;: &#39;(float) - A duration&#39; }</span>
+<span class="sd">          ],</span>
+<span class="sd">          &#39;description&#39;: &#39;Adds a new timer.&#39;</span>
+<span class="sd">        }</span>
+<span class="sd">      ]</span>
+<span class="sd">    })</span>
+
+<span class="sd">Lets implement the interface and register the implementation at the local node:</span>
+
+<span class="sd">    #!python</span>
+
+<span class="sd">    timerImpl = supcon.intf.Implementation(timerIntf)</span>
+<span class="sd">    </span>
+<span class="sd">    def fireTimeout(timer):</span>
+<span class="sd">      timerImpl.fire(&#39;timeout&#39;, { &#39;timer&#39;: timer })</span>
+<span class="sd">    </span>
+<span class="sd">    def onAdd(timer, seconds):</span>
+<span class="sd">      reactor.callLater(seconds, lambda: fireTimeout(timer))</span>
+
+<span class="sd">    timerImpl.setCallCb(&#39;add&#39;, onAdd)</span>
+
+<span class="sd">    lServer.register(&#39;/myTimer&#39;, timerImpl)</span>
+
+<span class="sd">Now you can watch for timeout events and add a timer via the</span>
+<span class="sd">&lt;code&gt;lClient&lt;/code&gt; reference:</span>
+
+<span class="sd">    #!python</span>
+<span class="sd">    lClient.on(&#39;my-unique-server&#39;, &#39;/myTimer&#39;, &#39;com.example.Timer&#39;, &#39;timeout&#39;, </span>
+<span class="sd">      lambda *args: print(&#39;, &#39;.join([ &#39;{}&#39;.format(i) for i in args ]))</span>
+<span class="sd">    )</span>
+
+<span class="sd">    lClient.call(&#39;my-unique-server&#39;, &#39;/myTimer&#39;, &#39;com.example.Timer&#39;, &#39;add&#39;, {</span>
+<span class="sd">      &#39;timer&#39;: &#39;5Seconds&#39;, &#39;seconds&#39;: 5</span>
+<span class="sd">    })</span>
+
+<span class="sd">And don&#39;t forget to start the reactor (aka event loop)</span>
+
+<span class="sd">    #!python</span>
+<span class="sd">    reactor.run()</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+</pre></div>
+
+  </div>
+
+  </header>
+
+  <section id="section-items">
+
+
+
+    <h2 class="section-title" id="header-submodules">Sub-modules</h2>
+      <div class="item">
+      <p class="name"><a href="/screwerk/supcon/clone.m.md">supcon.clone</a></p>
+      
+  
+
+      </div>
+      <div class="item">
+      <p class="name"><a href="/screwerk/supcon/core.m.md">supcon.core</a></p>
+      
+  
+    <div class="desc"><p>This module provides the implementation of abstract class <a href="/screwerk/supcon/intf.m.md#supcon.intf.Node"><code>supcon.intf.Node</code></a>.</p></div>
+
+      </div>
+      <div class="item">
+      <p class="name"><a href="/screwerk/supcon/intf.m.md">supcon.intf</a></p>
+      
+  
+    <div class="desc"><p>This module contains the classes to describe interfaces on the supcon bus,
+a base class <a href="/screwerk/supcon/intf.m.md#supcon.intf.Implementation"><code>supcon.intf.Implementation</code></a> to implemet those interfaces and the
+abstract class <a href="/screwerk/supcon/intf.m.md#supcon.intf.Node"><code>supcon.intf.Node</code></a> which contains methods to interact with the
+supcon bus.</p></div>
+
+      </div>
+      <div class="item">
+      <p class="name"><a href="/screwerk/supcon/keyed.m.md">supcon.keyed</a></p>
+      
+  
+
+      </div>
+      <div class="item">
+      <p class="name"><a href="/screwerk/supcon/store.m.md">supcon.store</a></p>
+      
+  
+
+      </div>
+      <div class="item">
+      <p class="name"><a href="/screwerk/supcon/switch.m.md">supcon.switch</a></p>
+      
+  
+
+      </div>
+      <div class="item">
+      <p class="name"><a href="/screwerk/supcon/util.m.md">supcon.util</a></p>
+      
+  
+
+      </div>
+  </section>
+
+    </article>
+</div>
diff --git a/doc/intf.m.md b/doc/intf.m.md
new file mode 100644 (file)
index 0000000..fdcc08b
--- /dev/null
@@ -0,0 +1,6687 @@
+<link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,300' rel='stylesheet' type='text/css'>
+
+
+<style type="text/css">
+
+  .CONTENT {
+    padding: 0;
+  }
+
+  #container {
+    display: flex;
+    flex-directtion: column;
+  }
+
+  #content {
+    padding: 30px;
+    border-left: 1px solid #ddd;
+  }
+  #sidebar {
+    padding: 30px;
+  }
+
+  #footer {
+    font-size: .75em;
+    padding: 5px 30px;
+    border-top: 1px solid #ddd;
+    text-align: right;
+  }
+  #footer p {
+    margin: 0 0 0 30px;
+    display: inline-block;
+  }
+
+  h1, h2, h3, h4, h5 {
+    font-weight: 300;
+  }
+  h1 {
+    font-size: 2.5em;
+    line-height: 1.1em;
+    margin: 0 0 .50em 0;
+  }
+
+  h2 {
+    font-size: 1.75em;
+    margin: 1em 0 .50em 0;
+  }
+
+  h3 {
+    margin: 25px 0 10px 0;
+  }
+
+  h4 {
+    margin: 0;
+    font-size: 105%;
+  }
+
+  a {
+    color: #058;
+    text-decoration: none;
+    transition: color .3s ease-in-out;
+  }
+
+  a:hover {
+    color: #e08524;
+    transition: color .3s ease-in-out;
+  }
+
+  pre, code, .mono, .name {
+    font-family: "Ubuntu Mono", "Cousine", "DejaVu Sans Mono", monospace;
+  }
+
+  .title .name {
+    font-weight: bold;
+  }
+  .section-title {
+    margin-top: 2em;
+  }
+  .ident {
+    color: #900;
+  }
+
+  code {
+    background: #f9f9f9;
+  } 
+
+  pre {
+    background: #fefefe;
+    border: 1px solid #ddd;
+    box-shadow: 2px 2px 0 #f3f3f3;
+    margin: 0 30px;
+    padding: 15px 30px;
+  }
+
+  .codehilite {
+    margin: 0 30px 10px 30px;
+  }
+
+    .codehilite pre {
+      margin: 0;
+    }
+    .codehilite .err { background: #ff3300; color: #fff !important; } 
+
+  table#module-list {
+    font-size: 110%;
+  }
+
+    table#module-list tr td:first-child {
+      padding-right: 10px;
+      white-space: nowrap;
+    }
+
+    table#module-list td {
+      vertical-align: top;
+      padding-bottom: 8px;
+    }
+
+      table#module-list td p {
+        margin: 0 0 7px 0;
+      }
+
+  .def {
+    display: table;
+  }
+
+    .def p {
+      display: table-cell;
+      vertical-align: top;
+      text-align: left;
+    }
+
+    .def p:first-child {
+      white-space: nowrap;
+    }
+
+    .def p:last-child {
+      width: 100%;
+    }
+
+
+  #index {
+    list-style-type: none;
+    margin: 0;
+    padding: 0;
+  }
+    ul#index .class_name {
+      /* font-size: 110%; */
+      font-weight: bold;
+    }
+    #index ul {
+      margin: 0;
+    }
+
+  .item {
+    margin: 0 0 15px 0;
+  }
+
+    .item .class {
+      margin: 0 0 25px 30px;
+    }
+
+      .item .class ul.class_list {
+        margin: 0 0 20px 0;
+      }
+
+    .item .name {
+      background: #fafafa;
+      margin: 0;
+      font-weight: bold;
+      padding: 5px 10px;
+      border-radius: 3px;
+      display: inline-block;
+      min-width: 40%;
+    }
+      .item .name:hover {
+        background: #f6f6f6;
+      }
+
+    .item .empty_desc {
+      margin: 0 0 5px 0;
+      padding: 0;
+    }
+
+    .item .inheritance {
+      margin: 3px 0 0 30px;
+    }
+
+    .item .inherited {
+      color: #666;
+    }
+
+    .item .desc {
+      padding: 0 8px;
+      margin: 0;
+    }
+
+      .item .desc p {
+        margin: 0 0 10px 0;
+      }
+
+    .source_cont {
+      margin: 0;
+      padding: 0;
+    }
+
+    .source_link a {
+      background: #ffc300;
+      font-weight: 400;
+      font-size: .75em;
+      text-transform: uppercase;
+      color: #fff;
+      text-shadow: 1px 1px 0 #f4b700;
+      
+      padding: 3px 8px;
+      border-radius: 2px;
+      transition: background .3s ease-in-out;
+    }
+      .source_link a:hover {
+        background: #FF7200;
+        text-shadow: none;
+        transition: background .3s ease-in-out;
+      }
+
+    .source {
+      display: none;
+      max-height: 600px;
+      overflow-y: scroll;
+      margin-bottom: 15px;
+    }
+
+      .source .codehilite {
+        margin: 0;
+      }
+
+  .desc h1, .desc h2, .desc h3 {
+    font-size: 100% !important;
+  }
+  .clear {
+    clear: both;
+  }
+
+  @media all and (max-width: 950px) {
+    #sidebar {
+      width: 35%;
+    }
+    #content {
+      width: 65%;
+    }
+  }
+  @media all and (max-width: 650px) {
+    #top {
+      display: none;
+    }
+    #sidebar {
+      float: none;
+      width: auto;
+    }
+    #content {
+      float: none;
+      width: auto;
+      padding: 30px;
+    }
+
+    #index ul {
+      padding: 0;
+      margin-bottom: 15px;
+    }
+    #index ul li {
+      display: inline-block;
+      margin-right: 30px;
+    }
+    #footer {
+      text-align: left;
+    }
+    #footer p {
+      display: block;
+      margin: inherit;
+    }
+  }
+
+  /*****************************/
+
+</style>
+
+<style type="text/css">
+.codehilite .hll { background-color: #ffffcc }
+.codehilite  { background: #f8f8f8; }
+.codehilite .c { color: #408080; font-style: italic } /* Comment */
+.codehilite .err { border: 1px solid #FF0000 } /* Error */
+.codehilite .k { color: #008000; font-weight: bold } /* Keyword */
+.codehilite .o { color: #666666 } /* Operator */
+.codehilite .ch { color: #408080; font-style: italic } /* Comment.Hashbang */
+.codehilite .cm { color: #408080; font-style: italic } /* Comment.Multiline */
+.codehilite .cp { color: #BC7A00 } /* Comment.Preproc */
+.codehilite .cpf { color: #408080; font-style: italic } /* Comment.PreprocFile */
+.codehilite .c1 { color: #408080; font-style: italic } /* Comment.Single */
+.codehilite .cs { color: #408080; font-style: italic } /* Comment.Special */
+.codehilite .gd { color: #A00000 } /* Generic.Deleted */
+.codehilite .ge { font-style: italic } /* Generic.Emph */
+.codehilite .gr { color: #FF0000 } /* Generic.Error */
+.codehilite .gh { color: #000080; font-weight: bold } /* Generic.Heading */
+.codehilite .gi { color: #00A000 } /* Generic.Inserted */
+.codehilite .go { color: #888888 } /* Generic.Output */
+.codehilite .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
+.codehilite .gs { font-weight: bold } /* Generic.Strong */
+.codehilite .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
+.codehilite .gt { color: #0044DD } /* Generic.Traceback */
+.codehilite .kc { color: #008000; font-weight: bold } /* Keyword.Constant */
+.codehilite .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
+.codehilite .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
+.codehilite .kp { color: #008000 } /* Keyword.Pseudo */
+.codehilite .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
+.codehilite .kt { color: #B00040 } /* Keyword.Type */
+.codehilite .m { color: #666666 } /* Literal.Number */
+.codehilite .s { color: #BA2121 } /* Literal.String */
+.codehilite .na { color: #7D9029 } /* Name.Attribute */
+.codehilite .nb { color: #008000 } /* Name.Builtin */
+.codehilite .nc { color: #0000FF; font-weight: bold } /* Name.Class */
+.codehilite .no { color: #880000 } /* Name.Constant */
+.codehilite .nd { color: #AA22FF } /* Name.Decorator */
+.codehilite .ni { color: #999999; font-weight: bold } /* Name.Entity */
+.codehilite .ne { color: #D2413A; font-weight: bold } /* Name.Exception */
+.codehilite .nf { color: #0000FF } /* Name.Function */
+.codehilite .nl { color: #A0A000 } /* Name.Label */
+.codehilite .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
+.codehilite .nt { color: #008000; font-weight: bold } /* Name.Tag */
+.codehilite .nv { color: #19177C } /* Name.Variable */
+.codehilite .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
+.codehilite .w { color: #bbbbbb } /* Text.Whitespace */
+.codehilite .mb { color: #666666 } /* Literal.Number.Bin */
+.codehilite .mf { color: #666666 } /* Literal.Number.Float */
+.codehilite .mh { color: #666666 } /* Literal.Number.Hex */
+.codehilite .mi { color: #666666 } /* Literal.Number.Integer */
+.codehilite .mo { color: #666666 } /* Literal.Number.Oct */
+.codehilite .sa { color: #BA2121 } /* Literal.String.Affix */
+.codehilite .sb { color: #BA2121 } /* Literal.String.Backtick */
+.codehilite .sc { color: #BA2121 } /* Literal.String.Char */
+.codehilite .dl { color: #BA2121 } /* Literal.String.Delimiter */
+.codehilite .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
+.codehilite .s2 { color: #BA2121 } /* Literal.String.Double */
+.codehilite .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */
+.codehilite .sh { color: #BA2121 } /* Literal.String.Heredoc */
+.codehilite .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */
+.codehilite .sx { color: #008000 } /* Literal.String.Other */
+.codehilite .sr { color: #BB6688 } /* Literal.String.Regex */
+.codehilite .s1 { color: #BA2121 } /* Literal.String.Single */
+.codehilite .ss { color: #19177C } /* Literal.String.Symbol */
+.codehilite .bp { color: #008000 } /* Name.Builtin.Pseudo */
+.codehilite .fm { color: #0000FF } /* Name.Function.Magic */
+.codehilite .vc { color: #19177C } /* Name.Variable.Class */
+.codehilite .vg { color: #19177C } /* Name.Variable.Global */
+.codehilite .vi { color: #19177C } /* Name.Variable.Instance */
+.codehilite .vm { color: #19177C } /* Name.Variable.Magic */
+.codehilite .il { color: #666666 } /* Literal.Number.Integer.Long */
+</style>
+
+<script type="text/javascript">
+function toggle(id, $link) {
+  $node = document.getElementById(id);
+  if (!$node) return;
+  if (!$node.style.display || $node.style.display == 'none') {
+    $node.style.display = 'block';
+    $link.innerHTML = 'Hide source &nequiv;';
+  } else {
+    $node.style.display = 'none';
+    $link.innerHTML = 'Show source &equiv;';
+  }
+}
+</script>
+
+<div id="container">
+    
+  
+  <div id="sidebar">
+    <a href="/screwerk/supcon">Doc</a>
+
+    <h1>Index</h1>
+    <ul id="index">
+
+
+    <li class="set"><h3><a href="/screwerk/supcon/intf.m.md#header-classes">Classes</a></h3>
+      <ul>
+        <li class="mono">
+        <span class="class_name"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DArgument">DArgument</a></span>
+        
+          
+  <ul>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DArgument.load">load</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DArgument.toDescription">toDescription</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DArgument.toName">toName</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DArgument.__init__">__init__</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DArgument.dump">dump</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DArgument.validate">validate</a></li>
+  </ul>
+
+        </li>
+        <li class="mono">
+        <span class="class_name"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DArguments">DArguments</a></span>
+        
+          
+  <ul>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DArguments.load">load</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DArguments.to">to</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DArguments.__init__">__init__</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DArguments.dump">dump</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DArguments.get">get</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DArguments.items">items</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DArguments.keys">keys</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DArguments.values">values</a></li>
+  </ul>
+
+        </li>
+        <li class="mono">
+        <span class="class_name"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DEvent">DEvent</a></span>
+        
+          
+  <ul>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DEvent.load">load</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DEvent.toDescription">toDescription</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DEvent.toName">toName</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DEvent.__init__">__init__</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DEvent.dump">dump</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DEvent.validateArgs">validateArgs</a></li>
+  </ul>
+
+        </li>
+        <li class="mono">
+        <span class="class_name"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DEvents">DEvents</a></span>
+        
+          
+  <ul>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DEvents.load">load</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DEvents.to">to</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DEvents.__init__">__init__</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DEvents.dump">dump</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DEvents.get">get</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DEvents.items">items</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DEvents.keys">keys</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DEvents.values">values</a></li>
+  </ul>
+
+        </li>
+        <li class="mono">
+        <span class="class_name"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DInterface">DInterface</a></span>
+        
+          
+  <ul>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DInterface.load">load</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DInterface.toDescription">toDescription</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DInterface.toName">toName</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DInterface.__init__">__init__</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DInterface.dump">dump</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DInterface.validateCall">validateCall</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DInterface.validateEvent">validateEvent</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DInterface.validateReturn">validateReturn</a></li>
+  </ul>
+
+        </li>
+        <li class="mono">
+        <span class="class_name"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DInterfaces">DInterfaces</a></span>
+        
+          
+  <ul>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DInterfaces.load">load</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DInterfaces.to">to</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DInterfaces.__init__">__init__</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DInterfaces.dump">dump</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DInterfaces.get">get</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DInterfaces.items">items</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DInterfaces.keys">keys</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DInterfaces.values">values</a></li>
+  </ul>
+
+        </li>
+        <li class="mono">
+        <span class="class_name"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DMethod">DMethod</a></span>
+        
+          
+  <ul>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DMethod.load">load</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DMethod.toDescription">toDescription</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DMethod.toName">toName</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DMethod.__init__">__init__</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DMethod.dump">dump</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DMethod.validateInArgs">validateInArgs</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DMethod.validateOutArgs">validateOutArgs</a></li>
+  </ul>
+
+        </li>
+        <li class="mono">
+        <span class="class_name"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DMethods">DMethods</a></span>
+        
+          
+  <ul>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DMethods.load">load</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DMethods.to">to</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DMethods.__init__">__init__</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DMethods.dump">dump</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DMethods.get">get</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DMethods.items">items</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DMethods.keys">keys</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DMethods.values">values</a></li>
+  </ul>
+
+        </li>
+        <li class="mono">
+        <span class="class_name"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNode">DNode</a></span>
+        
+          
+  <ul>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNode.load">load</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNode.to">to</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNode.toName">toName</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNode.__init__">__init__</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNode.addInterface">addInterface</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNode.addPath">addPath</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNode.delInterface">delInterface</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNode.delPath">delPath</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNode.dump">dump</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNode.get">get</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNode.hasIntf">hasIntf</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNode.hasPath">hasPath</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNode.items">items</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNode.keys">keys</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNode.values">values</a></li>
+  </ul>
+
+        </li>
+        <li class="mono">
+        <span class="class_name"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNodes">DNodes</a></span>
+        
+          
+  <ul>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNodes.load">load</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNodes.to">to</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNodes.__init__">__init__</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNodes.addInterface">addInterface</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNodes.addNode">addNode</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNodes.addPath">addPath</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNodes.delInterface">delInterface</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNodes.delNode">delNode</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNodes.delPath">delPath</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNodes.dump">dump</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNodes.get">get</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNodes.hasIntf">hasIntf</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNodes.hasNode">hasNode</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNodes.hasPath">hasPath</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNodes.items">items</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNodes.keys">keys</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNodes.values">values</a></li>
+  </ul>
+
+        </li>
+        <li class="mono">
+        <span class="class_name"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DPath">DPath</a></span>
+        
+          
+  <ul>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DPath.load">load</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DPath.to">to</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DPath.toName">toName</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DPath.__init__">__init__</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DPath.addInterface">addInterface</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DPath.delInterface">delInterface</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DPath.dump">dump</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DPath.get">get</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DPath.items">items</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DPath.keys">keys</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.DPath.values">values</a></li>
+  </ul>
+
+        </li>
+        <li class="mono">
+        <span class="class_name"><a href="/screwerk/supcon/intf.m.md#supcon.intf.Implementation">Implementation</a></span>
+        
+          
+  <ul>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.Implementation.__init__">__init__</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.Implementation.addFireCb">addFireCb</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.Implementation.call">call</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.Implementation.delFireCb">delFireCb</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.Implementation.fire">fire</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.Implementation.setCallCb">setCallCb</a></li>
+  </ul>
+
+        </li>
+        <li class="mono">
+        <span class="class_name"><a href="/screwerk/supcon/intf.m.md#supcon.intf.Named">Named</a></span>
+        
+          
+  <ul>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.Named.toName">toName</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.Named.__init__">__init__</a></li>
+  </ul>
+
+        </li>
+        <li class="mono">
+        <span class="class_name"><a href="/screwerk/supcon/intf.m.md#supcon.intf.NamedAndDescribed">NamedAndDescribed</a></span>
+        
+          
+  <ul>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.NamedAndDescribed.toDescription">toDescription</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.NamedAndDescribed.toName">toName</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.NamedAndDescribed.__init__">__init__</a></li>
+  </ul>
+
+        </li>
+        <li class="mono">
+        <span class="class_name"><a href="/screwerk/supcon/intf.m.md#supcon.intf.Node">Node</a></span>
+        
+          
+  <ul>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.Node.toName">toName</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.Node.__init__">__init__</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.Node.call">call</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.Node.connect">connect</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.Node.listen">listen</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.Node.nodes">nodes</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.Node.off">off</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.Node.on">on</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.Node.register">register</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.Node.unregister">unregister</a></li>
+  </ul>
+
+        </li>
+        <li class="mono">
+        <span class="class_name"><a href="/screwerk/supcon/intf.m.md#supcon.intf.Object">Object</a></span>
+        
+          
+  <ul>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.Object.__init__">__init__</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.Object.implementation">implementation</a></li>
+    <li class="mono"><a href="/screwerk/supcon/intf.m.md#supcon.intf.Object.interface">interface</a></li>
+  </ul>
+
+        </li>
+      </ul>
+    </li>
+
+    </ul>
+  </div>
+
+    <article id="content">
+      
+  
+
+  
+
+
+  <header id="section-intro">
+  <h1 class="title"><span class="name">supcon.intf</span> module</h1>
+  <p>This module contains the classes to describe interfaces on the supcon bus,
+a base class <a href="/screwerk/supcon/intf.m.md#supcon.intf.Implementation"><code>Implementation</code></a> to implemet those interfaces and the
+abstract class <a href="/screwerk/supcon/intf.m.md#supcon.intf.Node"><code>Node</code></a> which contains methods to interact with the
+supcon bus.</p>
+  
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf" class="source">
+    <div class="codehilite"><pre><span></span><span class="c1"># -*- coding: utf-8 -*-</span>
+<span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">This module contains the classes to describe interfaces on the supcon bus,</span>
+<span class="sd">a base class `supcon.intf.Implementation` to implemet those interfaces and the</span>
+<span class="sd">abstract class `supcon.intf.Node` which contains methods to interact with the</span>
+<span class="sd">supcon bus.</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="kn">import</span> <span class="nn">re</span>
+<span class="kn">import</span> <span class="nn">abc</span>
+<span class="kn">import</span> <span class="nn">itertools</span>
+<span class="kn">import</span> <span class="nn">traceback</span>
+
+<span class="kn">import</span> <span class="nn">twisted.internet.defer</span> <span class="kn">as</span> <span class="nn">defer</span>
+
+<span class="kn">import</span> <span class="nn">supcon.util</span>
+
+<span class="k">class</span> <span class="nc">Named</span><span class="p">(</span><span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">Named</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;A base class for objects with a name.</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+
+  <span class="n">regex</span> <span class="o">=</span> <span class="bp">None</span>
+  <span class="sd">&quot;&quot;&quot;re.RegexObject: a regular expression, the name must conform to&quot;&quot;&quot;</span>
+
+  <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Initializes the NamedAndDescribed instance</span>
+
+<span class="sd">    Args:</span>
+<span class="sd">      name (str): the name of the argument</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">toName</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
+
+  <span class="nd">@property</span>
+  <span class="k">def</span> <span class="nf">name</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
+    <span class="sd">&quot;&quot;&quot;str: the name&quot;&quot;&quot;</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__name</span>
+
+  <span class="nd">@classmethod</span>
+  <span class="k">def</span> <span class="nf">toName</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
+    <span class="sd">&quot;&quot;&quot;Converts the value into a name. If this is impossible a ValueError is</span>
+<span class="sd">    raised.</span>
+
+<span class="sd">    Args:</span>
+<span class="sd">      value (any): the value</span>
+<span class="sd">    Raises:</span>
+<span class="sd">      ValueError</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="n">value</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+    <span class="k">if</span> <span class="ow">not</span> <span class="bp">cls</span><span class="o">.</span><span class="n">regex</span><span class="o">.</span><span class="n">fullmatch</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;value {} must match {} fully&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">cls</span><span class="o">.</span><span class="n">regex</span><span class="o">.</span><span class="n">pattern</span><span class="p">))</span>
+    <span class="k">return</span> <span class="n">value</span>
+
+
+<span class="k">class</span> <span class="nc">NamedAndDescribed</span><span class="p">(</span><span class="n">Named</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;A base class for the interface describing classes `supcon.intf.Argument`,</span>
+<span class="sd">  `supcon.intf.Event`, `supcon.intf.Method` and `supcon.intf.Interface` that</span>
+<span class="sd">  all have the properties name and description.&quot;&quot;&quot;</span>
+
+  <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">description</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Initializes the NamedAndDescribed instance</span>
+
+<span class="sd">    Args:</span>
+<span class="sd">      name (str): the name of the argument</span>
+<span class="sd">      description (str): a description of the argument</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="n">Named</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__description</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">toDescription</span><span class="p">(</span><span class="n">description</span><span class="p">)</span>
+
+  <span class="nd">@property</span>
+  <span class="k">def</span> <span class="nf">description</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
+    <span class="sd">&quot;&quot;&quot;str: a description&quot;&quot;&quot;</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__description</span>
+
+  <span class="nd">@classmethod</span>
+  <span class="k">def</span> <span class="nf">toDescription</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
+    <span class="sd">&quot;&quot;&quot;Converts the value into a description. If this is impossible a ValueError</span>
+<span class="sd">    is raised.</span>
+
+<span class="sd">    Args:</span>
+<span class="sd">      value (any): the value</span>
+<span class="sd">    Raises:</span>
+<span class="sd">      ValueError</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+
+
+<span class="k">class</span> <span class="nc">DArgument</span><span class="p">(</span><span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">Dumpable</span><span class="p">,</span> <span class="n">NamedAndDescribed</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;Describes an input or output argument of a `supcon.intf.DMethod` or an</span>
+<span class="sd">  argument of a `supcon.intf.DEvent`&quot;&quot;&quot;</span>
+
+  <span class="n">regex</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s1">&#39;[a-zA-Z0-9]+&#39;</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">validate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">argument</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Validates the given argument value. Raises an ValueError if validation</span>
+<span class="sd">    fails.</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+
+  <span class="k">def</span> <span class="nf">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="n">data</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">}</span>
+    <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">description</span> <span class="o">!=</span> <span class="s1">&#39;&#39;</span><span class="p">:</span>
+      <span class="n">data</span><span class="p">[</span><span class="s1">&#39;description&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">description</span>
+    <span class="k">return</span> <span class="n">data</span>
+
+  <span class="nd">@classmethod</span>
+  <span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+    <span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="o">**</span><span class="n">data</span><span class="p">)</span>
+
+
+<span class="k">class</span> <span class="nc">DArguments</span><span class="p">(</span><span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">NamedList</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;A readonly map of `supcon.intf.DArgument` instances&quot;&quot;&quot;</span>
+  <span class="n">vtype</span> <span class="o">=</span> <span class="n">DArgument</span>
+
+
+<span class="k">class</span> <span class="nc">DEvent</span><span class="p">(</span><span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">Dumpable</span><span class="p">,</span> <span class="n">NamedAndDescribed</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;Describes an event that can be emitted by an implementation on the bus&quot;&quot;&quot;</span>
+
+  <span class="n">regex</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s1">&#39;[a-zA-Z0-9]+&#39;</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="n">DArguments</span><span class="p">(),</span> <span class="n">description</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Initializes the Event</span>
+
+<span class="sd">    Args:</span>
+<span class="sd">      name (str): the name of the event</span>
+<span class="sd">      args (DArguments): the list of arguments of the event</span>
+<span class="sd">      description (str): a description of the event</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="n">NamedAndDescribed</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">description</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__args</span> <span class="o">=</span> <span class="n">DArguments</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
+
+  <span class="nd">@property</span>
+  <span class="k">def</span> <span class="nf">args</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">DArguments</span><span class="p">:</span>
+    <span class="sd">&quot;&quot;&quot;DArguments: the list of arguments of the event&quot;&quot;&quot;</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__args</span>
+
+  <span class="k">def</span> <span class="nf">validateArgs</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">args</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Validates the given argument map. Raises an ValueError if validation</span>
+<span class="sd">    fails.</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">args</span><span class="p">:</span>
+      <span class="k">if</span> <span class="n">arg</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__args</span><span class="p">:</span>
+        <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;event {} has no argument {}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">arg</span><span class="p">))</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__args</span><span class="p">[</span><span class="n">arg</span><span class="p">]</span><span class="o">.</span><span class="n">validate</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="n">arg</span><span class="p">])</span>
+    <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__args</span><span class="p">:</span>
+      <span class="k">if</span> <span class="n">arg</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">args</span><span class="p">:</span>
+        <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;event {} needs argument {}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">arg</span><span class="p">))</span>
+
+  <span class="k">def</span> <span class="nf">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="n">data</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">}</span>
+    <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">:</span>
+      <span class="n">data</span><span class="p">[</span><span class="s1">&#39;args&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span>
+    <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">description</span> <span class="o">!=</span> <span class="s1">&#39;&#39;</span><span class="p">:</span>
+      <span class="n">data</span><span class="p">[</span><span class="s1">&#39;description&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">description</span>
+    <span class="k">return</span> <span class="n">data</span>
+
+  <span class="nd">@classmethod</span>
+  <span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+    <span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="o">**</span><span class="n">data</span><span class="p">)</span>
+
+
+<span class="k">class</span> <span class="nc">DEvents</span><span class="p">(</span><span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">NamedList</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;A readonly map of `supcon.intf.DEvent` instances&quot;&quot;&quot;</span>
+  <span class="n">vtype</span> <span class="o">=</span> <span class="n">DEvent</span>
+
+
+<span class="k">class</span> <span class="nc">DMethod</span><span class="p">(</span><span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">Dumpable</span><span class="p">,</span> <span class="n">NamedAndDescribed</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;A DMethod that can be called on an Object on the Bus&quot;&quot;&quot;</span>
+
+  <span class="n">regex</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s1">&#39;[a-zA-Z0-9]+&#39;</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">inArgs</span><span class="o">=</span><span class="n">DArguments</span><span class="p">(),</span> <span class="n">outArgs</span><span class="o">=</span><span class="n">DArguments</span><span class="p">(),</span> <span class="n">description</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Initializes the Event</span>
+
+<span class="sd">    Args:</span>
+<span class="sd">      name (str): the name of the method</span>
+<span class="sd">      inArgs (DArguments): the list of input arguments of the method</span>
+<span class="sd">      outArgs (DArguments): the list of output arguments of the method</span>
+<span class="sd">      description (str): a description of the method</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="n">NamedAndDescribed</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">description</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__inArgs</span> <span class="o">=</span> <span class="n">DArguments</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="n">inArgs</span><span class="p">)</span><span class="c1">#</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__outArgs</span> <span class="o">=</span> <span class="n">DArguments</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="n">outArgs</span><span class="p">)</span>
+
+  <span class="nd">@property</span>
+  <span class="k">def</span> <span class="nf">inArgs</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">DArguments</span><span class="p">:</span>
+    <span class="sd">&quot;&quot;&quot;DArguments: The input arguments of the method&quot;&quot;&quot;</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__inArgs</span>
+
+  <span class="nd">@property</span>
+  <span class="k">def</span> <span class="nf">outArgs</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">DArguments</span><span class="p">:</span>
+    <span class="sd">&quot;&quot;&quot;DArguments: The output arguments of the method&quot;&quot;&quot;</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__outArgs</span>
+
+  <span class="k">def</span> <span class="nf">validateInArgs</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">inArgs</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Validates the given argument Mapping. Raises an ValueError if validation fails</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">inArgs</span><span class="p">:</span>
+      <span class="k">if</span> <span class="n">arg</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__inArgs</span><span class="p">:</span>
+        <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;method {} has no input argument {}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">arg</span><span class="p">))</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__inArgs</span><span class="p">[</span><span class="n">arg</span><span class="p">]</span><span class="o">.</span><span class="n">validate</span><span class="p">(</span><span class="n">inArgs</span><span class="p">[</span><span class="n">arg</span><span class="p">])</span>
+    <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__inArgs</span><span class="p">:</span>
+      <span class="k">if</span> <span class="n">arg</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">inArgs</span><span class="p">:</span>
+        <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;method {} needs input argument {}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">arg</span><span class="p">))</span>
+
+  <span class="k">def</span> <span class="nf">validateOutArgs</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">outArgs</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Validates the given argument Mapping. Raises an ValueError if validation fails</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">outArgs</span><span class="p">:</span>
+      <span class="k">if</span> <span class="n">arg</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__outArgs</span><span class="p">:</span>
+        <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;method {} has no output argument {}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">arg</span><span class="p">))</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__outArgs</span><span class="p">[</span><span class="n">arg</span><span class="p">]</span><span class="o">.</span><span class="n">validate</span><span class="p">(</span><span class="n">outArgs</span><span class="p">[</span><span class="n">arg</span><span class="p">])</span>
+    <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__outArgs</span><span class="p">:</span>
+      <span class="k">if</span> <span class="n">arg</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">outArgs</span><span class="p">:</span>
+        <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;method {} needs output argument {}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">arg</span><span class="p">))</span>
+
+  <span class="k">def</span> <span class="nf">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="n">data</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">}</span>
+    <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">inArgs</span><span class="p">:</span>
+      <span class="n">data</span><span class="p">[</span><span class="s1">&#39;inArgs&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">inArgs</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span>
+    <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">outArgs</span><span class="p">:</span>
+      <span class="n">data</span><span class="p">[</span><span class="s1">&#39;outArgs&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">outArgs</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span>
+    <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">description</span> <span class="o">!=</span> <span class="s1">&#39;&#39;</span><span class="p">:</span>
+      <span class="n">data</span><span class="p">[</span><span class="s1">&#39;description&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">description</span>
+    <span class="k">return</span> <span class="n">data</span>
+
+  <span class="nd">@classmethod</span>
+  <span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+    <span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="o">**</span><span class="n">data</span><span class="p">)</span>
+
+
+<span class="k">class</span> <span class="nc">DMethods</span><span class="p">(</span><span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">NamedList</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;A readonly map of `supcon.intf.DMethod` instances&quot;&quot;&quot;</span>
+  <span class="n">vtype</span> <span class="o">=</span> <span class="n">DMethod</span>
+
+
+<span class="k">class</span> <span class="nc">DInterface</span><span class="p">(</span><span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">Dumpable</span><span class="p">,</span> <span class="n">NamedAndDescribed</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;An Interface that is implemented by an Object on the Bus&quot;&quot;&quot;</span>
+
+  <span class="n">regex</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s1">&#39;([a-zA-Z0-9_]+</span><span class="se">\\</span><span class="s1">.)*[a-zA-Z0-9_]+&#39;</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">events</span><span class="o">=</span><span class="n">DEvents</span><span class="p">(),</span> <span class="n">methods</span><span class="o">=</span><span class="n">DMethods</span><span class="p">(),</span> <span class="n">description</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Initializes the Event</span>
+
+<span class="sd">    Args:</span>
+<span class="sd">      name (str): the name of the interface</span>
+<span class="sd">      events (DEvents): the list of events of the interface</span>
+<span class="sd">      methods (DMethods): the list of methods of the interface</span>
+<span class="sd">      description (str): a description of the interface</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="n">NamedAndDescribed</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">description</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__events</span> <span class="o">=</span> <span class="n">DEvents</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="n">events</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__methods</span> <span class="o">=</span> <span class="n">DMethods</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="n">methods</span><span class="p">)</span>
+
+  <span class="nd">@property</span>
+  <span class="k">def</span> <span class="nf">events</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">DEvents</span><span class="p">:</span>
+    <span class="sd">&quot;&quot;&quot;DEvent: the list of events this interface can emit&quot;&quot;&quot;</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__events</span>
+
+  <span class="nd">@property</span>
+  <span class="k">def</span> <span class="nf">methods</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">DMethods</span><span class="p">:</span>
+    <span class="sd">&quot;&quot;&quot;DMethods: the list of methods this interface provides&quot;&quot;&quot;</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__methods</span>
+
+  <span class="k">def</span> <span class="nf">validateEvent</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Validates that the given event is an event of this interface and that</span>
+<span class="sd">    the given arguments are arguments of the event</span>
+
+<span class="sd">    Args:</span>
+<span class="sd">      event (str): the event</span>
+<span class="sd">      args (dict): the arguments</span>
+<span class="sd">    Raises:</span>
+<span class="sd">      ValueError</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="n">event</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">event</span><span class="p">)</span>
+    <span class="k">if</span> <span class="n">event</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__events</span><span class="p">:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;event {} is unknown&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">event</span><span class="p">))</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__events</span><span class="p">[</span><span class="n">event</span><span class="p">]</span><span class="o">.</span><span class="n">validateArgs</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">validateCall</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">inArgs</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Asserts that the given method is a method of this interface and that</span>
+<span class="sd">    the given arguments are input arguments of the method</span>
+
+<span class="sd">    Args:</span>
+<span class="sd">      event (str): the event</span>
+<span class="sd">      inArgs (dict): the input arguments</span>
+<span class="sd">    Raises:</span>
+<span class="sd">      AssertationError</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="n">method</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">method</span><span class="p">)</span>
+    <span class="k">if</span> <span class="n">method</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__methods</span><span class="p">:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;method {} is unknown&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">))</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__methods</span><span class="p">[</span><span class="n">method</span><span class="p">]</span><span class="o">.</span><span class="n">validateInArgs</span><span class="p">(</span><span class="n">inArgs</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">validateReturn</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">outArgs</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Asserts that the given method is a method of this interface and that</span>
+<span class="sd">    the given arguments are output arguments of the method</span>
+
+<span class="sd">    Args:</span>
+<span class="sd">      event (str): the event</span>
+<span class="sd">      outArgs (dict): the output arguments</span>
+<span class="sd">    Raises:</span>
+<span class="sd">      AssertationError</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="n">method</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">method</span><span class="p">)</span>
+    <span class="k">if</span> <span class="n">method</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__methods</span><span class="p">:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;method {} is unknown&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">))</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__methods</span><span class="p">[</span><span class="n">method</span><span class="p">]</span><span class="o">.</span><span class="n">validateOutArgs</span><span class="p">(</span><span class="n">outArgs</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="n">data</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">}</span>
+    <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">events</span><span class="p">:</span>
+      <span class="n">data</span><span class="p">[</span><span class="s1">&#39;events&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">events</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span>
+    <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">methods</span><span class="p">:</span>
+      <span class="n">data</span><span class="p">[</span><span class="s1">&#39;methods&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">methods</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span>
+    <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">description</span> <span class="o">!=</span> <span class="s1">&#39;&#39;</span><span class="p">:</span>
+      <span class="n">data</span><span class="p">[</span><span class="s1">&#39;description&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">description</span>
+    <span class="k">return</span> <span class="n">data</span>
+
+  <span class="nd">@classmethod</span>
+  <span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+    <span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="o">**</span><span class="n">data</span><span class="p">)</span>
+
+
+<span class="k">class</span> <span class="nc">DInterfaces</span><span class="p">(</span><span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">NamedList</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;A readonly map of `supcon.intf.DInterface` instances&quot;&quot;&quot;</span>
+  <span class="n">vtype</span> <span class="o">=</span> <span class="n">DInterface</span>
+
+
+<span class="k">class</span> <span class="nc">DPath</span><span class="p">(</span><span class="n">Named</span><span class="p">,</span> <span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">NamedList</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;A named readonly map of `supcon.intf.DInterface` instances&quot;&quot;&quot;</span>
+
+  <span class="n">vtype</span> <span class="o">=</span> <span class="n">DInterface</span>
+  <span class="n">regex</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s1">&#39;/(([a-zA-Z0-9_]+/)*[a-zA-Z0-9_]+)?&#39;</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">interfaces</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Initializes the Path instance</span>
+
+<span class="sd">    Args:</span>
+<span class="sd">      name (str): the name of the argument</span>
+<span class="sd">      interfaces (): ...</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">if</span> <span class="n">interfaces</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+      <span class="n">interfaces</span> <span class="o">=</span> <span class="p">[]</span>
+    <span class="n">Named</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
+    <span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">NamedList</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">interfaces</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="k">return</span> <span class="p">{</span>
+      <span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
+      <span class="s1">&#39;interfaces&#39;</span><span class="p">:</span> <span class="p">[</span><span class="n">value</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span> <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()]</span>
+    <span class="p">}</span>
+
+  <span class="nd">@classmethod</span>
+  <span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s1">&#39;DPath&#39;</span><span class="p">:</span>
+    <span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="o">**</span><span class="n">data</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">addInterface</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">interface</span><span class="p">:</span> <span class="n">DInterface</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s1">&#39;DPath&#39;</span><span class="p">:</span>
+    <span class="k">if</span> <span class="n">interface</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;interface {} at path {} already exists&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">interface</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+    <span class="n">interfaces</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">(),</span> <span class="p">[</span><span class="n">interface</span><span class="p">])</span>
+    <span class="k">return</span> <span class="n">DPath</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">interfaces</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">delInterface</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">interface</span><span class="p">:</span> <span class="n">DInterface</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s1">&#39;DPath&#39;</span><span class="p">:</span>
+    <span class="k">if</span> <span class="n">interface</span><span class="o">.</span><span class="n">name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;interface {} at path {} does not exist&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">interface</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+    <span class="n">interfaces</span> <span class="o">=</span> <span class="p">(</span><span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="n">interface</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+    <span class="k">return</span> <span class="n">DPath</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">interfaces</span><span class="p">)</span>
+
+
+<span class="k">class</span> <span class="nc">DNode</span><span class="p">(</span><span class="n">Named</span><span class="p">,</span> <span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">NamedList</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;A named readonly map of `supcon.intf.DPath` instances&quot;&quot;&quot;</span>
+
+  <span class="n">vtype</span> <span class="o">=</span> <span class="n">DPath</span>
+  <span class="n">regex</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s1">&#39;.+&#39;</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">paths</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Initializes the Path instance</span>
+
+<span class="sd">    Args:</span>
+<span class="sd">      name (str): the name of the argument</span>
+<span class="sd">      paths (): ...</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">if</span> <span class="n">paths</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+      <span class="n">paths</span> <span class="o">=</span> <span class="p">[]</span>
+
+    <span class="n">Named</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
+    <span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">NamedList</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">paths</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="k">return</span> <span class="p">{</span>
+      <span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
+      <span class="s1">&#39;paths&#39;</span><span class="p">:</span> <span class="p">[</span><span class="n">value</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span> <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()]</span>
+    <span class="p">}</span>
+
+  <span class="nd">@classmethod</span>
+  <span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s1">&#39;DPath&#39;</span><span class="p">:</span>
+    <span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="o">**</span><span class="n">data</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">hasPath</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
+    <span class="k">return</span> <span class="n">path</span> <span class="ow">in</span> <span class="bp">self</span>
+
+  <span class="k">def</span> <span class="nf">hasIntf</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">intf</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
+    <span class="k">return</span> <span class="n">path</span> <span class="ow">in</span> <span class="bp">self</span> <span class="ow">and</span> <span class="n">intf</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">[</span><span class="n">path</span><span class="p">]</span>
+
+  <span class="k">def</span> <span class="nf">addPath</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s1">&#39;DNode&#39;</span><span class="p">:</span>
+    <span class="k">if</span> <span class="n">path</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;path {} on node {} already exists&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+    <span class="n">paths</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">(),</span> <span class="p">[</span><span class="n">DPath</span><span class="p">(</span><span class="n">path</span><span class="p">)])</span>
+    <span class="k">return</span> <span class="n">DNode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">paths</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">delPath</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s1">&#39;DNode&#39;</span><span class="p">:</span>
+    <span class="k">if</span> <span class="n">path</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;path {} on node {} does not exist&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+    <span class="k">if</span> <span class="bp">self</span><span class="p">[</span><span class="n">path</span><span class="p">]:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;path {} on node {} is not empty&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+    <span class="n">paths</span> <span class="o">=</span> <span class="p">(</span><span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="n">path</span><span class="p">)</span>
+    <span class="k">return</span> <span class="n">DNode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">paths</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">addInterface</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">interface</span><span class="p">:</span> <span class="n">DInterface</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s1">&#39;DNode&#39;</span><span class="p">:</span>
+    <span class="k">if</span> <span class="n">path</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;path {} on node {} does not exist&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+    <span class="k">if</span> <span class="n">interface</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">[</span><span class="n">path</span><span class="p">]:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;interface {} at path {} on node {} already exists&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">interface</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+    <span class="n">paths</span> <span class="o">=</span> <span class="p">(</span><span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="n">path</span><span class="p">)</span>
+    <span class="n">paths</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="n">paths</span><span class="p">,</span> <span class="p">[</span><span class="bp">self</span><span class="p">[</span><span class="n">path</span><span class="p">]</span><span class="o">.</span><span class="n">addInterface</span><span class="p">(</span><span class="n">interface</span><span class="p">)])</span>
+    <span class="k">return</span> <span class="n">DNode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">paths</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">delInterface</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">interface</span><span class="p">:</span> <span class="n">DInterface</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s1">&#39;DNode&#39;</span><span class="p">:</span>
+    <span class="k">if</span> <span class="n">path</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;path {} on node {} does not exist&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+    <span class="k">if</span> <span class="n">interface</span><span class="o">.</span><span class="n">name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">[</span><span class="n">path</span><span class="p">]:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;interface {} at path {} on node {} does not exist&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">interface</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+    <span class="n">paths</span> <span class="o">=</span> <span class="p">(</span><span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="n">path</span><span class="p">)</span>
+    <span class="n">paths</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="n">paths</span><span class="p">,</span> <span class="p">[</span><span class="bp">self</span><span class="p">[</span><span class="n">path</span><span class="p">]</span><span class="o">.</span><span class="n">delInterface</span><span class="p">(</span><span class="n">interface</span><span class="p">)])</span>
+    <span class="k">return</span> <span class="n">DNode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">paths</span><span class="p">)</span>
+
+
+<span class="k">class</span> <span class="nc">DNodes</span><span class="p">(</span><span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">NamedList</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;A readonly map of `supcon.intf.DNode` instances&quot;&quot;&quot;</span>
+  <span class="n">vtype</span> <span class="o">=</span> <span class="n">DNode</span>
+
+  <span class="k">def</span> <span class="nf">hasNode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
+    <span class="k">return</span> <span class="n">node</span> <span class="ow">in</span> <span class="bp">self</span>
+
+  <span class="k">def</span> <span class="nf">hasPath</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
+    <span class="k">return</span> <span class="n">node</span> <span class="ow">in</span> <span class="bp">self</span> <span class="ow">and</span> <span class="n">path</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">[</span><span class="n">node</span><span class="p">]</span>
+
+  <span class="k">def</span> <span class="nf">hasIntf</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">intf</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
+    <span class="k">return</span> <span class="n">node</span> <span class="ow">in</span> <span class="bp">self</span> <span class="ow">and</span> <span class="n">path</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">[</span><span class="n">node</span><span class="p">]</span> <span class="ow">and</span> <span class="n">intf</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">[</span><span class="n">node</span><span class="p">][</span><span class="n">path</span><span class="p">]</span>
+
+  <span class="k">def</span> <span class="nf">addNode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s1">&#39;DNodes&#39;</span><span class="p">:</span>
+    <span class="k">if</span> <span class="n">node</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;node {} already exists&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+    <span class="n">nodes</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">(),</span> <span class="p">[</span><span class="n">DNode</span><span class="p">(</span><span class="n">node</span><span class="p">)])</span>
+    <span class="k">return</span> <span class="n">DNodes</span><span class="p">(</span><span class="n">nodes</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">delNode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s1">&#39;DNodes&#39;</span><span class="p">:</span>
+    <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;node {} does not exist&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+    <span class="k">if</span> <span class="bp">self</span><span class="p">[</span><span class="n">node</span><span class="p">]:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;node {} is not empty&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+    <span class="n">nodes</span> <span class="o">=</span> <span class="p">(</span><span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="n">node</span><span class="p">)</span>
+    <span class="k">return</span> <span class="n">DNodes</span><span class="p">(</span><span class="n">nodes</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">addPath</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s1">&#39;DNodes&#39;</span><span class="p">:</span>
+    <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;node {} does not exist&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+    <span class="n">nodes</span> <span class="o">=</span> <span class="p">(</span><span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="n">node</span><span class="p">)</span>
+    <span class="n">nodes</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="n">nodes</span><span class="p">,</span> <span class="p">[</span><span class="bp">self</span><span class="p">[</span><span class="n">node</span><span class="p">]</span><span class="o">.</span><span class="n">addPath</span><span class="p">(</span><span class="n">path</span><span class="p">)])</span>
+    <span class="k">return</span> <span class="n">DNodes</span><span class="p">(</span><span class="n">nodes</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">delPath</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s1">&#39;DNodes&#39;</span><span class="p">:</span>
+    <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;node {} does not exist&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+    <span class="n">nodes</span> <span class="o">=</span> <span class="p">(</span><span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="n">node</span><span class="p">)</span>
+    <span class="n">nodes</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="n">nodes</span><span class="p">,</span> <span class="p">[</span><span class="bp">self</span><span class="p">[</span><span class="n">node</span><span class="p">]</span><span class="o">.</span><span class="n">delPath</span><span class="p">(</span><span class="n">path</span><span class="p">)])</span>
+    <span class="k">return</span> <span class="n">DNodes</span><span class="p">(</span><span class="n">nodes</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">addInterface</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">interface</span><span class="p">:</span> <span class="n">DInterface</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s1">&#39;DNodes&#39;</span><span class="p">:</span>
+    <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;node {} does not exist&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+    <span class="n">nodes</span> <span class="o">=</span> <span class="p">(</span><span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="n">node</span><span class="p">)</span>
+    <span class="n">nodes</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="n">nodes</span><span class="p">,</span> <span class="p">[</span><span class="bp">self</span><span class="p">[</span><span class="n">node</span><span class="p">]</span><span class="o">.</span><span class="n">addInterface</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">interface</span><span class="p">)])</span>
+    <span class="k">return</span> <span class="n">DNodes</span><span class="p">(</span><span class="n">nodes</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">delInterface</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">interface</span><span class="p">:</span> <span class="n">DInterface</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s1">&#39;DNodes&#39;</span><span class="p">:</span>
+    <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;node {} does not exist&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+    <span class="n">nodes</span> <span class="o">=</span> <span class="p">(</span><span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="n">node</span><span class="p">)</span>
+    <span class="n">nodes</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="n">nodes</span><span class="p">,</span> <span class="p">[</span><span class="bp">self</span><span class="p">[</span><span class="n">node</span><span class="p">]</span><span class="o">.</span><span class="n">delInterface</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">interface</span><span class="p">)])</span>
+    <span class="k">return</span> <span class="n">DNodes</span><span class="p">(</span><span class="n">nodes</span><span class="p">)</span>
+
+
+<span class="k">class</span> <span class="nc">Implementation</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;The base class for interface implementations&quot;&quot;&quot;</span>
+
+  <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">interface</span><span class="p">:</span> <span class="n">DInterface</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    Args:</span>
+<span class="sd">      interface (DInterface): the interface that is implemented by this Implementation</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">interface</span><span class="p">,</span> <span class="n">DInterface</span><span class="p">):</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;interface must be an instance of {}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">DInterface</span><span class="p">))</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__interface</span> <span class="o">=</span> <span class="n">interface</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__callCbs</span> <span class="o">=</span> <span class="p">{}</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__fireCbs</span> <span class="o">=</span> <span class="p">[]</span>
+
+  <span class="nd">@property</span>
+  <span class="k">def</span> <span class="nf">intf</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
+    <span class="sd">&quot;&quot;&quot;str: The name of the implemented interface&quot;&quot;&quot;</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__interface</span><span class="o">.</span><span class="n">name</span>
+
+  <span class="nd">@property</span>
+  <span class="k">def</span> <span class="nf">interface</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">DInterface</span><span class="p">:</span>
+    <span class="sd">&quot;&quot;&quot;Interface: The implemented interface&quot;&quot;&quot;</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__interface</span>
+
+  <span class="k">def</span> <span class="nf">setCallCb</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">method</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">cb</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Sets a callback for the given method. The method must be a method of the</span>
+<span class="sd">    interface this Implementation implements. The callback must implement the</span>
+<span class="sd">    given method. The callback gets called by calls to Implementation.call()</span>
+
+<span class="sd">    Args:</span>
+<span class="sd">      method (str): the interface method that the callback implements</span>
+<span class="sd">      cb (callable): the callback</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="n">method</span> <span class="o">=</span> <span class="n">DMethod</span><span class="o">.</span><span class="n">toName</span><span class="p">(</span><span class="n">method</span><span class="p">)</span>
+    <span class="k">if</span> <span class="n">method</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callCbs</span><span class="p">:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;Callback for method {} is already set!&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">))</span>
+    <span class="k">if</span> <span class="n">method</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__interface</span><span class="o">.</span><span class="n">methods</span><span class="p">:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;Interface has no method {}!&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">))</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__callCbs</span><span class="p">[</span><span class="n">method</span><span class="p">]</span> <span class="o">=</span> <span class="n">cb</span>
+
+  <span class="k">def</span> <span class="nf">call</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">method</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">inArgs</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+    <span class="sd">&quot;&quot;&quot;Calls the given interface method with the given arguments. This method</span>
+<span class="sd">    calls the callback set by Implementation.setCallCb()</span>
+
+<span class="sd">    Args:</span>
+<span class="sd">      method (str): the called interface method</span>
+<span class="sd">      inArgs (Mapping): a map of input arguments</span>
+<span class="sd">    Returns:</span>
+<span class="sd">      defer.Deferred: Resolves with the result of the called method</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">def</span> <span class="nf">validateReturn</span><span class="p">(</span><span class="n">outArgs</span><span class="p">):</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__interface</span><span class="o">.</span><span class="n">validateReturn</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">outArgs</span><span class="p">)</span>
+      <span class="k">return</span> <span class="n">outArgs</span>
+
+    <span class="k">try</span><span class="p">:</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__interface</span><span class="o">.</span><span class="n">validateCall</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">inArgs</span><span class="p">)</span>
+      <span class="k">if</span> <span class="n">method</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callCbs</span><span class="p">:</span>
+        <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;Callback for method {} is not set!&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">))</span>
+
+      <span class="n">d</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callCbs</span><span class="p">[</span><span class="n">method</span><span class="p">](</span><span class="o">**</span><span class="n">inArgs</span><span class="p">)</span>
+      <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">d</span><span class="p">,</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">):</span>
+        <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">succeed</span><span class="p">(</span><span class="n">d</span><span class="p">)</span>
+      <span class="n">d</span><span class="o">.</span><span class="n">addCallback</span><span class="p">(</span><span class="n">validateReturn</span><span class="p">)</span>
+    <span class="k">except</span> <span class="ne">BaseException</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
+      <span class="n">traceback</span><span class="o">.</span><span class="n">print_exc</span><span class="p">()</span>
+      <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">fail</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
+
+    <span class="k">return</span> <span class="n">d</span>
+
+  <span class="k">def</span> <span class="nf">addFireCb</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cb</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Adds a callback that gets called, when this Implementation fires an</span>
+<span class="sd">    event.</span>
+
+<span class="sd">    Args:</span>
+<span class="sd">      cb (callable): the callback</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__fireCbs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">cb</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">delFireCb</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cb</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Removes a callback that gets called, when this Implementation fires an</span>
+<span class="sd">    event.</span>
+
+<span class="sd">    Args:</span>
+<span class="sd">      cb (callable): the callback</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__fireCbs</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">cb</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">fire</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">args</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Fires the given event with the given arguments.</span>
+
+<span class="sd">    Args:</span>
+<span class="sd">      event (str): the event name</span>
+<span class="sd">      args (collecion.Mapping): the event arguments</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__interface</span><span class="o">.</span><span class="n">validateEvent</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+
+    <span class="k">for</span> <span class="n">cb</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__fireCbs</span><span class="p">:</span>
+      <span class="n">cb</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+
+
+
+<span class="k">class</span> <span class="nc">Object</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+
+  <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">interfaces</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    Args:</span>
+<span class="sd">      interfaces (DInterfaces): the interfaces that are implemented by this Object</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">if</span> <span class="n">interfaces</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+      <span class="n">interfaces</span> <span class="o">=</span> <span class="p">[]</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__intfs</span> <span class="o">=</span> <span class="p">{}</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span> <span class="o">=</span> <span class="p">{}</span>
+
+    <span class="k">def</span> <span class="nf">getCallCb</span><span class="p">(</span><span class="n">intf</span><span class="p">):</span>
+      <span class="k">return</span> <span class="k">lambda</span> <span class="n">method</span><span class="p">,</span> <span class="n">inArgs</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__call</span><span class="p">(</span><span class="n">intf</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">inArgs</span><span class="p">)</span>
+
+    <span class="k">for</span> <span class="n">interface</span> <span class="ow">in</span> <span class="n">interfaces</span><span class="p">:</span>
+      <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">interface</span><span class="p">,</span> <span class="n">DInterface</span><span class="p">):</span>
+        <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;interface must be an instance of {}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">DInterface</span><span class="p">))</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__intfs</span><span class="p">[</span><span class="n">interface</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">interface</span>
+
+      <span class="n">implementation</span> <span class="o">=</span> <span class="n">Implementation</span><span class="p">(</span><span class="n">interface</span><span class="p">)</span>
+      <span class="n">callCb</span> <span class="o">=</span> <span class="n">getCallCb</span><span class="p">(</span><span class="n">implementation</span><span class="o">.</span><span class="n">intf</span><span class="p">)</span>
+      <span class="k">for</span> <span class="n">method</span> <span class="ow">in</span> <span class="n">interface</span><span class="o">.</span><span class="n">methods</span><span class="p">:</span>
+        <span class="n">implementation</span><span class="o">.</span><span class="n">setCallCb</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">callCb</span><span class="p">)</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">implementation</span><span class="o">.</span><span class="n">intf</span><span class="p">]</span> <span class="o">=</span> <span class="n">implementation</span>
+
+  <span class="nd">@property</span>
+  <span class="k">def</span> <span class="nf">interfaces</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__intfs</span><span class="o">.</span><span class="n">values</span><span class="p">()</span>
+
+  <span class="nd">@property</span>
+  <span class="k">def</span> <span class="nf">implementations</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="o">.</span><span class="n">values</span><span class="p">()</span>
+
+  <span class="k">def</span> <span class="nf">interface</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">intf</span><span class="p">):</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__intfs</span><span class="p">[</span><span class="n">intf</span><span class="p">]</span>
+
+  <span class="k">def</span> <span class="nf">implementation</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">intf</span><span class="p">):</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">intf</span><span class="p">]</span>
+
+  <span class="k">def</span> <span class="nf">__call</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">intf</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">method</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">inArgs</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+    <span class="k">pass</span>
+
+
+<span class="k">class</span> <span class="nc">Node</span><span class="p">(</span><span class="n">abc</span><span class="o">.</span><span class="n">ABC</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;The Node Interface. This class defines the methods that participants can</span>
+<span class="sd">  use to access the supcon bus.&quot;&quot;&quot;</span>
+
+  <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+    <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">()</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">toName</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
+
+  <span class="nd">@property</span>
+  <span class="k">def</span> <span class="nf">name</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
+    <span class="sd">&quot;&quot;&quot;str: The name of the node on the bus&quot;&quot;&quot;</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__name</span>
+
+  <span class="nd">@classmethod</span>
+  <span class="k">def</span> <span class="nf">toName</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
+    <span class="k">return</span> <span class="n">DNode</span><span class="o">.</span><span class="n">toName</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+
+  <span class="nd">@abc.abstractmethod</span>
+  <span class="k">def</span> <span class="nf">nodes</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">DNodes</span><span class="p">:</span>
+    <span class="sd">&quot;&quot;&quot;list[str]: The currently connected nodes&quot;&quot;&quot;</span>
+    <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
+
+  <span class="nd">@abc.abstractmethod</span>
+  <span class="k">def</span> <span class="nf">connect</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">endpoint</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Connects the node to the given endpoint.</span>
+
+<span class="sd">    If the connection failes or closes the connection gets reestablished with an</span>
+<span class="sd">    exponential timeout up to two minutes.</span>
+
+<span class="sd">    Args:</span>
+<span class="sd">      endpoint (twisted.internet.interfaces.IStreamClientEndpoint):</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
+
+  <span class="nd">@abc.abstractmethod</span>
+  <span class="k">def</span> <span class="nf">listen</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">endpoint</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Listens at the given endpoint for incoming connections</span>
+
+<span class="sd">    Args:</span>
+<span class="sd">      endpoint (twisted.internet.interfaces.IStreamServerEndpoint):</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
+
+  <span class="nd">@abc.abstractmethod</span>
+  <span class="k">def</span> <span class="nf">register</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">impl</span><span class="p">:</span> <span class="n">Implementation</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Registers an implementation with the node</span>
+
+<span class="sd">    Args:</span>
+<span class="sd">      impl (Implementation):</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
+
+  <span class="nd">@abc.abstractmethod</span>
+  <span class="k">def</span> <span class="nf">unregister</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">impl</span><span class="p">:</span> <span class="n">Implementation</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Removes an implementation from the node</span>
+
+<span class="sd">    Args:</span>
+<span class="sd">      impl (supcon.intf.Implementation):</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
+
+  <span class="nd">@abc.abstractmethod</span>
+  <span class="k">def</span> <span class="nf">call</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">intf</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">method</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+    <span class="sd">&quot;&quot;&quot;Calls a method on the bus</span>
+
+<span class="sd">    Args:</span>
+<span class="sd">      node (str): a node on the bus</span>
+<span class="sd">      path (str): a path on the given node</span>
+<span class="sd">      intf (str): an interface at the given path</span>
+<span class="sd">      method (str): a method of the given interface</span>
+<span class="sd">      args (dict): a dict of method arguments</span>
+
+<span class="sd">    Returns:</span>
+<span class="sd">      defer.Deferred:</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
+
+  <span class="nd">@abc.abstractmethod</span>
+  <span class="k">def</span> <span class="nf">on</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">intf</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">event</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">cb</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Registers a callback for an event on the bus</span>
+
+<span class="sd">    Args:</span>
+<span class="sd">      node (str): a node on the bus</span>
+<span class="sd">      path (str): a path on the given node</span>
+<span class="sd">      intf (str): an interface at the given path</span>
+<span class="sd">      event (str): a method of the given interface</span>
+<span class="sd">      cb (callable): a callable that gets called with a dict of event arguments</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
+
+  <span class="nd">@abc.abstractmethod</span>
+  <span class="k">def</span> <span class="nf">off</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">intf</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">event</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">cb</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Unregisters a callback for an event on the bus</span>
+
+<span class="sd">    Args:</span>
+<span class="sd">      node (str): a node on the bus</span>
+<span class="sd">      path (str): a path on the given node</span>
+<span class="sd">      intf (str): an interface at the given path</span>
+<span class="sd">      event (str): a method of the given interface</span>
+<span class="sd">      cb (callable): a callable that gets called with a dict of event arguments</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
+</pre></div>
+
+  </div>
+
+  </header>
+
+  <section id="section-items">
+
+
+    <h2 class="section-title" id="header-classes">Classes</h2>
+      
+      <div class="item">
+      <p id="supcon.intf.DArgument" class="name">class <span class="ident">DArgument</span></p>
+      
+  
+    <div class="desc"><p>Describes an input or output argument of a <a href="/screwerk/supcon/intf.m.md#supcon.intf.DMethod"><code>DMethod</code></a> or an
+argument of a <a href="/screwerk/supcon/intf.m.md#supcon.intf.DEvent"><code>DEvent</code></a></p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DArgument', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DArgument" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">DArgument</span><span class="p">(</span><span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">Dumpable</span><span class="p">,</span> <span class="n">NamedAndDescribed</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;Describes an input or output argument of a `supcon.intf.DMethod` or an</span>
+<span class="sd">  argument of a `supcon.intf.DEvent`&quot;&quot;&quot;</span>
+
+  <span class="n">regex</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s1">&#39;[a-zA-Z0-9]+&#39;</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">validate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">argument</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Validates the given argument value. Raises an ValueError if validation</span>
+<span class="sd">    fails.</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+
+  <span class="k">def</span> <span class="nf">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="n">data</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">}</span>
+    <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">description</span> <span class="o">!=</span> <span class="s1">&#39;&#39;</span><span class="p">:</span>
+      <span class="n">data</span><span class="p">[</span><span class="s1">&#39;description&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">description</span>
+    <span class="k">return</span> <span class="n">data</span>
+
+  <span class="nd">@classmethod</span>
+  <span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+    <span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="o">**</span><span class="n">data</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+
+      <div class="class">
+          <h3>Ancestors (in MRO)</h3>
+          <ul class="class_list">
+          <li><a href="/screwerk/supcon/intf.m.md#supcon.intf.DArgument">DArgument</a></li>
+          <li>supcon.util.Dumpable</li>
+          <li><a href="/screwerk/supcon/intf.m.md#supcon.intf.NamedAndDescribed">NamedAndDescribed</a></li>
+          <li><a href="/screwerk/supcon/intf.m.md#supcon.intf.Named">Named</a></li>
+          <li>supcon.util.Named</li>
+          <li>abc.ABC</li>
+          <li>builtins.object</li>
+          </ul>
+          <h3>Class variables</h3>
+            <div class="item">
+            <p id="supcon.intf.DArgument.regex" class="name">var <span class="ident">regex</span></p>
+            
+
+            
+  
+  <div class="source_cont">
+</div>
+
+            </div>
+          <h3>Class Methods</h3>
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DArgument.load">
+    <p>def <span class="ident">load</span>(</p><p>cls, data)</p>
+    </div>
+    
+
+    
+  
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DArgument.load', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DArgument.load" class="source">
+    <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+  <span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="o">**</span><span class="n">data</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DArgument.toDescription">
+    <p>def <span class="ident">toDescription</span>(</p><p>cls, value)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Converts the value into a description. If this is impossible a ValueError
+is raised.</p>
+<p>Args:
+  value (any): the value
+Raises:
+  ValueError</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DArgument.toDescription', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DArgument.toDescription" class="source">
+    <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">toDescription</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
+  <span class="sd">&quot;&quot;&quot;Converts the value into a description. If this is impossible a ValueError</span>
+<span class="sd">  is raised.</span>
+<span class="sd">  Args:</span>
+<span class="sd">    value (any): the value</span>
+<span class="sd">  Raises:</span>
+<span class="sd">    ValueError</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DArgument.toName">
+    <p>def <span class="ident">toName</span>(</p><p>cls, value)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Converts the value into a name. If this is impossible a ValueError is
+raised.</p>
+<p>Args:
+  value (any): the value
+Raises:
+  ValueError</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DArgument.toName', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DArgument.toName" class="source">
+    <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">toName</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
+  <span class="sd">&quot;&quot;&quot;Converts the value into a name. If this is impossible a ValueError is</span>
+<span class="sd">  raised.</span>
+<span class="sd">  Args:</span>
+<span class="sd">    value (any): the value</span>
+<span class="sd">  Raises:</span>
+<span class="sd">    ValueError</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="n">value</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+  <span class="k">if</span> <span class="ow">not</span> <span class="bp">cls</span><span class="o">.</span><span class="n">regex</span><span class="o">.</span><span class="n">fullmatch</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
+    <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;value {} must match {} fully&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">cls</span><span class="o">.</span><span class="n">regex</span><span class="o">.</span><span class="n">pattern</span><span class="p">))</span>
+  <span class="k">return</span> <span class="n">value</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+          <h3>Instance variables</h3>
+            <div class="item">
+            <p id="supcon.intf.DArgument.description" class="name">var <span class="ident">description</span></p>
+            
+    <p class="inheritance">
+     <strong>Inheritance:</strong>
+       <code><a href="/screwerk/supcon/intf.m.md#supcon.intf.NamedAndDescribed">NamedAndDescribed</a></code>.<code><a href="/screwerk/supcon/intf.m.md#supcon.intf.NamedAndDescribed.description">description</a></code>
+    </p>
+
+            
+  
+    <div class="desc inherited"><p>str: a description</p></div>
+  <div class="source_cont">
+</div>
+
+            </div>
+            <div class="item">
+            <p id="supcon.intf.DArgument.name" class="name">var <span class="ident">name</span></p>
+            
+    <p class="inheritance">
+     <strong>Inheritance:</strong>
+       <code><a href="/screwerk/supcon/intf.m.md#supcon.intf.Named">Named</a></code>.<code><a href="/screwerk/supcon/intf.m.md#supcon.intf.Named.name">name</a></code>
+    </p>
+
+            
+  
+    <div class="desc inherited"><p>str: the name</p></div>
+  <div class="source_cont">
+</div>
+
+            </div>
+          <h3>Methods</h3>
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DArgument.__init__">
+    <p>def <span class="ident">__init__</span>(</p><p>self, name, description=&#39;&#39;)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Initializes the NamedAndDescribed instance</p>
+<p>Args:
+  name (str): the name of the argument
+  description (str): a description of the argument</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DArgument.__init__', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DArgument.__init__" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">description</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;Initializes the NamedAndDescribed instance</span>
+<span class="sd">  Args:</span>
+<span class="sd">    name (str): the name of the argument</span>
+<span class="sd">    description (str): a description of the argument</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="n">Named</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__description</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">toDescription</span><span class="p">(</span><span class="n">description</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DArgument.dump">
+    <p>def <span class="ident">dump</span>(</p><p>self)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Converts the <code>supcon.util.Dumpable</code> into a 'simple' datastructure.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DArgument.dump', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DArgument.dump" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+  <span class="n">data</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">}</span>
+  <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">description</span> <span class="o">!=</span> <span class="s1">&#39;&#39;</span><span class="p">:</span>
+    <span class="n">data</span><span class="p">[</span><span class="s1">&#39;description&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">description</span>
+  <span class="k">return</span> <span class="n">data</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DArgument.validate">
+    <p>def <span class="ident">validate</span>(</p><p>self, argument)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Validates the given argument value. Raises an ValueError if validation
+fails.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DArgument.validate', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DArgument.validate" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">validate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">argument</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;Validates the given argument value. Raises an ValueError if validation</span>
+<span class="sd">  fails.</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">pass</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+      </div>
+      </div>
+      
+      <div class="item">
+      <p id="supcon.intf.DArguments" class="name">class <span class="ident">DArguments</span></p>
+      
+  
+    <div class="desc"><p>A readonly map of <a href="/screwerk/supcon/intf.m.md#supcon.intf.DArgument"><code>DArgument</code></a> instances</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DArguments', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DArguments" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">DArguments</span><span class="p">(</span><span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">NamedList</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;A readonly map of `supcon.intf.DArgument` instances&quot;&quot;&quot;</span>
+  <span class="n">vtype</span> <span class="o">=</span> <span class="n">DArgument</span>
+</pre></div>
+
+  </div>
+</div>
+
+
+      <div class="class">
+          <h3>Ancestors (in MRO)</h3>
+          <ul class="class_list">
+          <li><a href="/screwerk/supcon/intf.m.md#supcon.intf.DArguments">DArguments</a></li>
+          <li>supcon.util.NamedList</li>
+          <li>collections.abc.Mapping</li>
+          <li>collections.abc.Collection</li>
+          <li>collections.abc.Sized</li>
+          <li>collections.abc.Iterable</li>
+          <li>collections.abc.Container</li>
+          <li>supcon.util.Dumpable</li>
+          <li>abc.ABC</li>
+          <li>builtins.object</li>
+          </ul>
+          <h3>Class variables</h3>
+            <div class="item">
+            <p id="supcon.intf.DArguments.vtype" class="name">var <span class="ident">vtype</span></p>
+            
+
+            
+  
+  <div class="source_cont">
+</div>
+
+            </div>
+          <h3>Class Methods</h3>
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DArguments.load">
+    <p>def <span class="ident">load</span>(</p><p>cls, data)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Converts the given list of 'simple' datastructures <strong>data</strong> into an instance
+of <strong>cls</strong>, a subclass of <code>supcon.util.NamedList</code>.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DArguments.load', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DArguments.load" class="source">
+    <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">  Converts the given list of &#39;simple&#39; datastructures **data** into an instance</span>
+<span class="sd">  of **cls**, a subclass of `supcon.util.NamedList`.</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DArguments.to">
+    <p>def <span class="ident">to</span>(</p><p>cls, value)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>If the the <strong>value</strong> is an instance of <strong>cls</strong>, a subclass of
+<code>supcon.util.NamedList</code>, the value is returned. If value is not an instance
+of <strong>cls</strong> the method tries to convert the <strong>value</strong> into an instance of
+<strong>cls</strong>.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DArguments.to', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DArguments.to" class="source">
+    <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">to</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">  If the the **value** is an instance of **cls**, a subclass of</span>
+<span class="sd">  `supcon.util.NamedList`, the value is returned. If value is not an instance</span>
+<span class="sd">  of **cls** the method tries to convert the **value** into an instance of</span>
+<span class="sd">  **cls**.</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">return</span> <span class="n">value</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">cls</span><span class="p">)</span> <span class="k">else</span> <span class="bp">cls</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+          <h3>Methods</h3>
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DArguments.__init__">
+    <p>def <span class="ident">__init__</span>(</p><p>self, values=None)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Initializes the <code>supcon.util.NamedList</code> with the given list of <strong>values</strong>.</p>
+<p>An element of <strong>values</strong> must be of type <code>supcon.util.NamedList.vtype</code> or a
+'simple' datastructure that can be converted to an instance of
+<code>supcon.util.NamedList.vtype</code> by <code>supcon.util.NamedList.vtype</code>.load().</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DArguments.__init__', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DArguments.__init__" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">values</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">  Initializes the `supcon.util.NamedList` with the given list of **values**.</span>
+<span class="sd">  An element of **values** must be of type `supcon.util.NamedList.vtype` or a</span>
+<span class="sd">  &#39;simple&#39; datastructure that can be converted to an instance of</span>
+<span class="sd">  `supcon.util.NamedList.vtype` by `supcon.util.NamedList.vtype`.load().</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">if</span> <span class="n">values</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+    <span class="n">values</span> <span class="o">=</span> <span class="p">[]</span>
+  <span class="k">if</span> <span class="ow">not</span> <span class="nb">issubclass</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="p">,</span> <span class="n">Named</span><span class="p">):</span>
+    <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;the value type must be a subclass of Named&#39;</span><span class="p">)</span>
+  <span class="k">if</span> <span class="ow">not</span> <span class="nb">issubclass</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="p">,</span> <span class="n">Dumpable</span><span class="p">):</span>
+    <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;the value type must be a subclass of Dumpable&#39;</span><span class="p">)</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__values</span> <span class="o">=</span> <span class="n">collections</span><span class="o">.</span><span class="n">OrderedDict</span><span class="p">()</span>
+  <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">values</span><span class="p">:</span>
+    <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="p">):</span>
+      <span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+    <span class="k">if</span> <span class="n">value</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__values</span><span class="p">:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;value.name must be unique in the given list of values&#39;</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__values</span><span class="p">[</span><span class="n">value</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DArguments.dump">
+    <p>def <span class="ident">dump</span>(</p><p>self)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Converts the <code>supcon.util.NamedList</code> into a list of 'simple' datastructures.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DArguments.dump', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DArguments.dump" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">  Converts the `supcon.util.NamedList` into a list of &#39;simple&#39; datastructures.</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">return</span> <span class="p">[</span><span class="n">value</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span> <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()]</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DArguments.get">
+    <p>def <span class="ident">get</span>(</p><p>self, key, default=None)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>D.get(k[,d]) -&gt; D[k] if k in D, else d.  d defaults to None.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DArguments.get', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DArguments.get" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">get</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+    <span class="s1">&#39;D.get(k[,d]) -&gt; D[k] if k in D, else d.  d defaults to None.&#39;</span>
+    <span class="k">try</span><span class="p">:</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
+    <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
+        <span class="k">return</span> <span class="n">default</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DArguments.items">
+    <p>def <span class="ident">items</span>(</p><p>self)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>D.items() -&gt; a set-like object providing a view on D's items</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DArguments.items', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DArguments.items" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">items</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="s2">&quot;D.items() -&gt; a set-like object providing a view on D&#39;s items&quot;</span>
+    <span class="k">return</span> <span class="n">ItemsView</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DArguments.keys">
+    <p>def <span class="ident">keys</span>(</p><p>self)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>D.keys() -&gt; a set-like object providing a view on D's keys</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DArguments.keys', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DArguments.keys" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">keys</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="s2">&quot;D.keys() -&gt; a set-like object providing a view on D&#39;s keys&quot;</span>
+    <span class="k">return</span> <span class="n">KeysView</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DArguments.values">
+    <p>def <span class="ident">values</span>(</p><p>self)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>D.values() -&gt; an object providing a view on D's values</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DArguments.values', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DArguments.values" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">values</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="s2">&quot;D.values() -&gt; an object providing a view on D&#39;s values&quot;</span>
+    <span class="k">return</span> <span class="n">ValuesView</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+      </div>
+      </div>
+      
+      <div class="item">
+      <p id="supcon.intf.DEvent" class="name">class <span class="ident">DEvent</span></p>
+      
+  
+    <div class="desc"><p>Describes an event that can be emitted by an implementation on the bus</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DEvent', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DEvent" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">DEvent</span><span class="p">(</span><span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">Dumpable</span><span class="p">,</span> <span class="n">NamedAndDescribed</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;Describes an event that can be emitted by an implementation on the bus&quot;&quot;&quot;</span>
+
+  <span class="n">regex</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s1">&#39;[a-zA-Z0-9]+&#39;</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="n">DArguments</span><span class="p">(),</span> <span class="n">description</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Initializes the Event</span>
+
+<span class="sd">    Args:</span>
+<span class="sd">      name (str): the name of the event</span>
+<span class="sd">      args (DArguments): the list of arguments of the event</span>
+<span class="sd">      description (str): a description of the event</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="n">NamedAndDescribed</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">description</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__args</span> <span class="o">=</span> <span class="n">DArguments</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
+
+  <span class="nd">@property</span>
+  <span class="k">def</span> <span class="nf">args</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">DArguments</span><span class="p">:</span>
+    <span class="sd">&quot;&quot;&quot;DArguments: the list of arguments of the event&quot;&quot;&quot;</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__args</span>
+
+  <span class="k">def</span> <span class="nf">validateArgs</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">args</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Validates the given argument map. Raises an ValueError if validation</span>
+<span class="sd">    fails.</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">args</span><span class="p">:</span>
+      <span class="k">if</span> <span class="n">arg</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__args</span><span class="p">:</span>
+        <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;event {} has no argument {}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">arg</span><span class="p">))</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__args</span><span class="p">[</span><span class="n">arg</span><span class="p">]</span><span class="o">.</span><span class="n">validate</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="n">arg</span><span class="p">])</span>
+    <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__args</span><span class="p">:</span>
+      <span class="k">if</span> <span class="n">arg</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">args</span><span class="p">:</span>
+        <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;event {} needs argument {}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">arg</span><span class="p">))</span>
+
+  <span class="k">def</span> <span class="nf">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="n">data</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">}</span>
+    <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">:</span>
+      <span class="n">data</span><span class="p">[</span><span class="s1">&#39;args&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span>
+    <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">description</span> <span class="o">!=</span> <span class="s1">&#39;&#39;</span><span class="p">:</span>
+      <span class="n">data</span><span class="p">[</span><span class="s1">&#39;description&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">description</span>
+    <span class="k">return</span> <span class="n">data</span>
+
+  <span class="nd">@classmethod</span>
+  <span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+    <span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="o">**</span><span class="n">data</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+
+      <div class="class">
+          <h3>Ancestors (in MRO)</h3>
+          <ul class="class_list">
+          <li><a href="/screwerk/supcon/intf.m.md#supcon.intf.DEvent">DEvent</a></li>
+          <li>supcon.util.Dumpable</li>
+          <li><a href="/screwerk/supcon/intf.m.md#supcon.intf.NamedAndDescribed">NamedAndDescribed</a></li>
+          <li><a href="/screwerk/supcon/intf.m.md#supcon.intf.Named">Named</a></li>
+          <li>supcon.util.Named</li>
+          <li>abc.ABC</li>
+          <li>builtins.object</li>
+          </ul>
+          <h3>Class variables</h3>
+            <div class="item">
+            <p id="supcon.intf.DEvent.regex" class="name">var <span class="ident">regex</span></p>
+            
+
+            
+  
+  <div class="source_cont">
+</div>
+
+            </div>
+          <h3>Class Methods</h3>
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DEvent.load">
+    <p>def <span class="ident">load</span>(</p><p>cls, data)</p>
+    </div>
+    
+
+    
+  
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DEvent.load', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DEvent.load" class="source">
+    <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+  <span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="o">**</span><span class="n">data</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DEvent.toDescription">
+    <p>def <span class="ident">toDescription</span>(</p><p>cls, value)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Converts the value into a description. If this is impossible a ValueError
+is raised.</p>
+<p>Args:
+  value (any): the value
+Raises:
+  ValueError</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DEvent.toDescription', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DEvent.toDescription" class="source">
+    <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">toDescription</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
+  <span class="sd">&quot;&quot;&quot;Converts the value into a description. If this is impossible a ValueError</span>
+<span class="sd">  is raised.</span>
+<span class="sd">  Args:</span>
+<span class="sd">    value (any): the value</span>
+<span class="sd">  Raises:</span>
+<span class="sd">    ValueError</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DEvent.toName">
+    <p>def <span class="ident">toName</span>(</p><p>cls, value)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Converts the value into a name. If this is impossible a ValueError is
+raised.</p>
+<p>Args:
+  value (any): the value
+Raises:
+  ValueError</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DEvent.toName', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DEvent.toName" class="source">
+    <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">toName</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
+  <span class="sd">&quot;&quot;&quot;Converts the value into a name. If this is impossible a ValueError is</span>
+<span class="sd">  raised.</span>
+<span class="sd">  Args:</span>
+<span class="sd">    value (any): the value</span>
+<span class="sd">  Raises:</span>
+<span class="sd">    ValueError</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="n">value</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+  <span class="k">if</span> <span class="ow">not</span> <span class="bp">cls</span><span class="o">.</span><span class="n">regex</span><span class="o">.</span><span class="n">fullmatch</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
+    <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;value {} must match {} fully&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">cls</span><span class="o">.</span><span class="n">regex</span><span class="o">.</span><span class="n">pattern</span><span class="p">))</span>
+  <span class="k">return</span> <span class="n">value</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+          <h3>Instance variables</h3>
+            <div class="item">
+            <p id="supcon.intf.DEvent.args" class="name">var <span class="ident">args</span></p>
+            
+
+            
+  
+    <div class="desc"><p>DArguments: the list of arguments of the event</p></div>
+  <div class="source_cont">
+</div>
+
+            </div>
+            <div class="item">
+            <p id="supcon.intf.DEvent.description" class="name">var <span class="ident">description</span></p>
+            
+
+            
+  
+    <div class="desc"><p>str: a description</p></div>
+  <div class="source_cont">
+</div>
+
+            </div>
+            <div class="item">
+            <p id="supcon.intf.DEvent.name" class="name">var <span class="ident">name</span></p>
+            
+
+            
+  
+    <div class="desc"><p>str: the name</p></div>
+  <div class="source_cont">
+</div>
+
+            </div>
+          <h3>Methods</h3>
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DEvent.__init__">
+    <p>def <span class="ident">__init__</span>(</p><p>self, name, args=supcon.intf.DArguments(), description=&#39;&#39;)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Initializes the Event</p>
+<p>Args:
+  name (str): the name of the event
+  args (DArguments): the list of arguments of the event
+  description (str): a description of the event</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DEvent.__init__', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DEvent.__init__" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="n">DArguments</span><span class="p">(),</span> <span class="n">description</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;Initializes the Event</span>
+<span class="sd">  Args:</span>
+<span class="sd">    name (str): the name of the event</span>
+<span class="sd">    args (DArguments): the list of arguments of the event</span>
+<span class="sd">    description (str): a description of the event</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="n">NamedAndDescribed</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">description</span><span class="p">)</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__args</span> <span class="o">=</span> <span class="n">DArguments</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DEvent.dump">
+    <p>def <span class="ident">dump</span>(</p><p>self)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Converts the <code>supcon.util.Dumpable</code> into a 'simple' datastructure.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DEvent.dump', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DEvent.dump" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+  <span class="n">data</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">}</span>
+  <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">:</span>
+    <span class="n">data</span><span class="p">[</span><span class="s1">&#39;args&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span>
+  <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">description</span> <span class="o">!=</span> <span class="s1">&#39;&#39;</span><span class="p">:</span>
+    <span class="n">data</span><span class="p">[</span><span class="s1">&#39;description&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">description</span>
+  <span class="k">return</span> <span class="n">data</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DEvent.validateArgs">
+    <p>def <span class="ident">validateArgs</span>(</p><p>self, args)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Validates the given argument map. Raises an ValueError if validation
+fails.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DEvent.validateArgs', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DEvent.validateArgs" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">validateArgs</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">args</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;Validates the given argument map. Raises an ValueError if validation</span>
+<span class="sd">  fails.</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">args</span><span class="p">:</span>
+    <span class="k">if</span> <span class="n">arg</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__args</span><span class="p">:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;event {} has no argument {}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">arg</span><span class="p">))</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__args</span><span class="p">[</span><span class="n">arg</span><span class="p">]</span><span class="o">.</span><span class="n">validate</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="n">arg</span><span class="p">])</span>
+  <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__args</span><span class="p">:</span>
+    <span class="k">if</span> <span class="n">arg</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">args</span><span class="p">:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;event {} needs argument {}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">arg</span><span class="p">))</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+      </div>
+      </div>
+      
+      <div class="item">
+      <p id="supcon.intf.DEvents" class="name">class <span class="ident">DEvents</span></p>
+      
+  
+    <div class="desc"><p>A readonly map of <a href="/screwerk/supcon/intf.m.md#supcon.intf.DEvent"><code>DEvent</code></a> instances</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DEvents', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DEvents" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">DEvents</span><span class="p">(</span><span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">NamedList</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;A readonly map of `supcon.intf.DEvent` instances&quot;&quot;&quot;</span>
+  <span class="n">vtype</span> <span class="o">=</span> <span class="n">DEvent</span>
+</pre></div>
+
+  </div>
+</div>
+
+
+      <div class="class">
+          <h3>Ancestors (in MRO)</h3>
+          <ul class="class_list">
+          <li><a href="/screwerk/supcon/intf.m.md#supcon.intf.DEvents">DEvents</a></li>
+          <li>supcon.util.NamedList</li>
+          <li>collections.abc.Mapping</li>
+          <li>collections.abc.Collection</li>
+          <li>collections.abc.Sized</li>
+          <li>collections.abc.Iterable</li>
+          <li>collections.abc.Container</li>
+          <li>supcon.util.Dumpable</li>
+          <li>abc.ABC</li>
+          <li>builtins.object</li>
+          </ul>
+          <h3>Class variables</h3>
+            <div class="item">
+            <p id="supcon.intf.DEvents.vtype" class="name">var <span class="ident">vtype</span></p>
+            
+
+            
+  
+  <div class="source_cont">
+</div>
+
+            </div>
+          <h3>Class Methods</h3>
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DEvents.load">
+    <p>def <span class="ident">load</span>(</p><p>cls, data)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Converts the given list of 'simple' datastructures <strong>data</strong> into an instance
+of <strong>cls</strong>, a subclass of <code>supcon.util.NamedList</code>.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DEvents.load', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DEvents.load" class="source">
+    <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">  Converts the given list of &#39;simple&#39; datastructures **data** into an instance</span>
+<span class="sd">  of **cls**, a subclass of `supcon.util.NamedList`.</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DEvents.to">
+    <p>def <span class="ident">to</span>(</p><p>cls, value)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>If the the <strong>value</strong> is an instance of <strong>cls</strong>, a subclass of
+<code>supcon.util.NamedList</code>, the value is returned. If value is not an instance
+of <strong>cls</strong> the method tries to convert the <strong>value</strong> into an instance of
+<strong>cls</strong>.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DEvents.to', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DEvents.to" class="source">
+    <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">to</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">  If the the **value** is an instance of **cls**, a subclass of</span>
+<span class="sd">  `supcon.util.NamedList`, the value is returned. If value is not an instance</span>
+<span class="sd">  of **cls** the method tries to convert the **value** into an instance of</span>
+<span class="sd">  **cls**.</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">return</span> <span class="n">value</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">cls</span><span class="p">)</span> <span class="k">else</span> <span class="bp">cls</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+          <h3>Methods</h3>
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DEvents.__init__">
+    <p>def <span class="ident">__init__</span>(</p><p>self, values=None)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Initializes the <code>supcon.util.NamedList</code> with the given list of <strong>values</strong>.</p>
+<p>An element of <strong>values</strong> must be of type <code>supcon.util.NamedList.vtype</code> or a
+'simple' datastructure that can be converted to an instance of
+<code>supcon.util.NamedList.vtype</code> by <code>supcon.util.NamedList.vtype</code>.load().</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DEvents.__init__', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DEvents.__init__" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">values</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">  Initializes the `supcon.util.NamedList` with the given list of **values**.</span>
+<span class="sd">  An element of **values** must be of type `supcon.util.NamedList.vtype` or a</span>
+<span class="sd">  &#39;simple&#39; datastructure that can be converted to an instance of</span>
+<span class="sd">  `supcon.util.NamedList.vtype` by `supcon.util.NamedList.vtype`.load().</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">if</span> <span class="n">values</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+    <span class="n">values</span> <span class="o">=</span> <span class="p">[]</span>
+  <span class="k">if</span> <span class="ow">not</span> <span class="nb">issubclass</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="p">,</span> <span class="n">Named</span><span class="p">):</span>
+    <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;the value type must be a subclass of Named&#39;</span><span class="p">)</span>
+  <span class="k">if</span> <span class="ow">not</span> <span class="nb">issubclass</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="p">,</span> <span class="n">Dumpable</span><span class="p">):</span>
+    <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;the value type must be a subclass of Dumpable&#39;</span><span class="p">)</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__values</span> <span class="o">=</span> <span class="n">collections</span><span class="o">.</span><span class="n">OrderedDict</span><span class="p">()</span>
+  <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">values</span><span class="p">:</span>
+    <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="p">):</span>
+      <span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+    <span class="k">if</span> <span class="n">value</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__values</span><span class="p">:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;value.name must be unique in the given list of values&#39;</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__values</span><span class="p">[</span><span class="n">value</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DEvents.dump">
+    <p>def <span class="ident">dump</span>(</p><p>self)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Converts the <code>supcon.util.NamedList</code> into a list of 'simple' datastructures.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DEvents.dump', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DEvents.dump" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">  Converts the `supcon.util.NamedList` into a list of &#39;simple&#39; datastructures.</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">return</span> <span class="p">[</span><span class="n">value</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span> <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()]</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DEvents.get">
+    <p>def <span class="ident">get</span>(</p><p>self, key, default=None)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>D.get(k[,d]) -&gt; D[k] if k in D, else d.  d defaults to None.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DEvents.get', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DEvents.get" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">get</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+    <span class="s1">&#39;D.get(k[,d]) -&gt; D[k] if k in D, else d.  d defaults to None.&#39;</span>
+    <span class="k">try</span><span class="p">:</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
+    <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
+        <span class="k">return</span> <span class="n">default</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DEvents.items">
+    <p>def <span class="ident">items</span>(</p><p>self)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>D.items() -&gt; a set-like object providing a view on D's items</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DEvents.items', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DEvents.items" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">items</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="s2">&quot;D.items() -&gt; a set-like object providing a view on D&#39;s items&quot;</span>
+    <span class="k">return</span> <span class="n">ItemsView</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DEvents.keys">
+    <p>def <span class="ident">keys</span>(</p><p>self)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>D.keys() -&gt; a set-like object providing a view on D's keys</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DEvents.keys', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DEvents.keys" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">keys</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="s2">&quot;D.keys() -&gt; a set-like object providing a view on D&#39;s keys&quot;</span>
+    <span class="k">return</span> <span class="n">KeysView</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DEvents.values">
+    <p>def <span class="ident">values</span>(</p><p>self)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>D.values() -&gt; an object providing a view on D's values</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DEvents.values', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DEvents.values" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">values</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="s2">&quot;D.values() -&gt; an object providing a view on D&#39;s values&quot;</span>
+    <span class="k">return</span> <span class="n">ValuesView</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+      </div>
+      </div>
+      
+      <div class="item">
+      <p id="supcon.intf.DInterface" class="name">class <span class="ident">DInterface</span></p>
+      
+  
+    <div class="desc"><p>An Interface that is implemented by an Object on the Bus</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DInterface', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DInterface" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">DInterface</span><span class="p">(</span><span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">Dumpable</span><span class="p">,</span> <span class="n">NamedAndDescribed</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;An Interface that is implemented by an Object on the Bus&quot;&quot;&quot;</span>
+
+  <span class="n">regex</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s1">&#39;([a-zA-Z0-9_]+</span><span class="se">\\</span><span class="s1">.)*[a-zA-Z0-9_]+&#39;</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">events</span><span class="o">=</span><span class="n">DEvents</span><span class="p">(),</span> <span class="n">methods</span><span class="o">=</span><span class="n">DMethods</span><span class="p">(),</span> <span class="n">description</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Initializes the Event</span>
+
+<span class="sd">    Args:</span>
+<span class="sd">      name (str): the name of the interface</span>
+<span class="sd">      events (DEvents): the list of events of the interface</span>
+<span class="sd">      methods (DMethods): the list of methods of the interface</span>
+<span class="sd">      description (str): a description of the interface</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="n">NamedAndDescribed</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">description</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__events</span> <span class="o">=</span> <span class="n">DEvents</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="n">events</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__methods</span> <span class="o">=</span> <span class="n">DMethods</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="n">methods</span><span class="p">)</span>
+
+  <span class="nd">@property</span>
+  <span class="k">def</span> <span class="nf">events</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">DEvents</span><span class="p">:</span>
+    <span class="sd">&quot;&quot;&quot;DEvent: the list of events this interface can emit&quot;&quot;&quot;</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__events</span>
+
+  <span class="nd">@property</span>
+  <span class="k">def</span> <span class="nf">methods</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">DMethods</span><span class="p">:</span>
+    <span class="sd">&quot;&quot;&quot;DMethods: the list of methods this interface provides&quot;&quot;&quot;</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__methods</span>
+
+  <span class="k">def</span> <span class="nf">validateEvent</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Validates that the given event is an event of this interface and that</span>
+<span class="sd">    the given arguments are arguments of the event</span>
+
+<span class="sd">    Args:</span>
+<span class="sd">      event (str): the event</span>
+<span class="sd">      args (dict): the arguments</span>
+<span class="sd">    Raises:</span>
+<span class="sd">      ValueError</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="n">event</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">event</span><span class="p">)</span>
+    <span class="k">if</span> <span class="n">event</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__events</span><span class="p">:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;event {} is unknown&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">event</span><span class="p">))</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__events</span><span class="p">[</span><span class="n">event</span><span class="p">]</span><span class="o">.</span><span class="n">validateArgs</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">validateCall</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">inArgs</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Asserts that the given method is a method of this interface and that</span>
+<span class="sd">    the given arguments are input arguments of the method</span>
+
+<span class="sd">    Args:</span>
+<span class="sd">      event (str): the event</span>
+<span class="sd">      inArgs (dict): the input arguments</span>
+<span class="sd">    Raises:</span>
+<span class="sd">      AssertationError</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="n">method</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">method</span><span class="p">)</span>
+    <span class="k">if</span> <span class="n">method</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__methods</span><span class="p">:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;method {} is unknown&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">))</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__methods</span><span class="p">[</span><span class="n">method</span><span class="p">]</span><span class="o">.</span><span class="n">validateInArgs</span><span class="p">(</span><span class="n">inArgs</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">validateReturn</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">outArgs</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Asserts that the given method is a method of this interface and that</span>
+<span class="sd">    the given arguments are output arguments of the method</span>
+
+<span class="sd">    Args:</span>
+<span class="sd">      event (str): the event</span>
+<span class="sd">      outArgs (dict): the output arguments</span>
+<span class="sd">    Raises:</span>
+<span class="sd">      AssertationError</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="n">method</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">method</span><span class="p">)</span>
+    <span class="k">if</span> <span class="n">method</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__methods</span><span class="p">:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;method {} is unknown&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">))</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__methods</span><span class="p">[</span><span class="n">method</span><span class="p">]</span><span class="o">.</span><span class="n">validateOutArgs</span><span class="p">(</span><span class="n">outArgs</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="n">data</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">}</span>
+    <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">events</span><span class="p">:</span>
+      <span class="n">data</span><span class="p">[</span><span class="s1">&#39;events&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">events</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span>
+    <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">methods</span><span class="p">:</span>
+      <span class="n">data</span><span class="p">[</span><span class="s1">&#39;methods&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">methods</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span>
+    <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">description</span> <span class="o">!=</span> <span class="s1">&#39;&#39;</span><span class="p">:</span>
+      <span class="n">data</span><span class="p">[</span><span class="s1">&#39;description&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">description</span>
+    <span class="k">return</span> <span class="n">data</span>
+
+  <span class="nd">@classmethod</span>
+  <span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+    <span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="o">**</span><span class="n">data</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+
+      <div class="class">
+          <h3>Ancestors (in MRO)</h3>
+          <ul class="class_list">
+          <li><a href="/screwerk/supcon/intf.m.md#supcon.intf.DInterface">DInterface</a></li>
+          <li>supcon.util.Dumpable</li>
+          <li><a href="/screwerk/supcon/intf.m.md#supcon.intf.NamedAndDescribed">NamedAndDescribed</a></li>
+          <li><a href="/screwerk/supcon/intf.m.md#supcon.intf.Named">Named</a></li>
+          <li>supcon.util.Named</li>
+          <li>abc.ABC</li>
+          <li>builtins.object</li>
+          </ul>
+          <h3>Class variables</h3>
+            <div class="item">
+            <p id="supcon.intf.DInterface.regex" class="name">var <span class="ident">regex</span></p>
+            
+
+            
+  
+  <div class="source_cont">
+</div>
+
+            </div>
+          <h3>Class Methods</h3>
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DInterface.load">
+    <p>def <span class="ident">load</span>(</p><p>cls, data)</p>
+    </div>
+    
+
+    
+  
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DInterface.load', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DInterface.load" class="source">
+    <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+  <span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="o">**</span><span class="n">data</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DInterface.toDescription">
+    <p>def <span class="ident">toDescription</span>(</p><p>cls, value)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Converts the value into a description. If this is impossible a ValueError
+is raised.</p>
+<p>Args:
+  value (any): the value
+Raises:
+  ValueError</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DInterface.toDescription', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DInterface.toDescription" class="source">
+    <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">toDescription</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
+  <span class="sd">&quot;&quot;&quot;Converts the value into a description. If this is impossible a ValueError</span>
+<span class="sd">  is raised.</span>
+<span class="sd">  Args:</span>
+<span class="sd">    value (any): the value</span>
+<span class="sd">  Raises:</span>
+<span class="sd">    ValueError</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DInterface.toName">
+    <p>def <span class="ident">toName</span>(</p><p>cls, value)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Converts the value into a name. If this is impossible a ValueError is
+raised.</p>
+<p>Args:
+  value (any): the value
+Raises:
+  ValueError</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DInterface.toName', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DInterface.toName" class="source">
+    <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">toName</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
+  <span class="sd">&quot;&quot;&quot;Converts the value into a name. If this is impossible a ValueError is</span>
+<span class="sd">  raised.</span>
+<span class="sd">  Args:</span>
+<span class="sd">    value (any): the value</span>
+<span class="sd">  Raises:</span>
+<span class="sd">    ValueError</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="n">value</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+  <span class="k">if</span> <span class="ow">not</span> <span class="bp">cls</span><span class="o">.</span><span class="n">regex</span><span class="o">.</span><span class="n">fullmatch</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
+    <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;value {} must match {} fully&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">cls</span><span class="o">.</span><span class="n">regex</span><span class="o">.</span><span class="n">pattern</span><span class="p">))</span>
+  <span class="k">return</span> <span class="n">value</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+          <h3>Instance variables</h3>
+            <div class="item">
+            <p id="supcon.intf.DInterface.description" class="name">var <span class="ident">description</span></p>
+            
+    <p class="inheritance">
+     <strong>Inheritance:</strong>
+       <code><a href="/screwerk/supcon/intf.m.md#supcon.intf.NamedAndDescribed">NamedAndDescribed</a></code>.<code><a href="/screwerk/supcon/intf.m.md#supcon.intf.NamedAndDescribed.description">description</a></code>
+    </p>
+
+            
+  
+    <div class="desc inherited"><p>str: a description</p></div>
+  <div class="source_cont">
+</div>
+
+            </div>
+            <div class="item">
+            <p id="supcon.intf.DInterface.events" class="name">var <span class="ident">events</span></p>
+            
+
+            
+  
+    <div class="desc"><p>DEvent: the list of events this interface can emit</p></div>
+  <div class="source_cont">
+</div>
+
+            </div>
+            <div class="item">
+            <p id="supcon.intf.DInterface.methods" class="name">var <span class="ident">methods</span></p>
+            
+
+            
+  
+    <div class="desc"><p>DMethods: the list of methods this interface provides</p></div>
+  <div class="source_cont">
+</div>
+
+            </div>
+            <div class="item">
+            <p id="supcon.intf.DInterface.name" class="name">var <span class="ident">name</span></p>
+            
+
+            
+  
+    <div class="desc"><p>str: the name</p></div>
+  <div class="source_cont">
+</div>
+
+            </div>
+          <h3>Methods</h3>
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DInterface.__init__">
+    <p>def <span class="ident">__init__</span>(</p><p>self, name, events=supcon.intf.DEvents(), methods=supcon.intf.DMethods(), description=&#39;&#39;)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Initializes the Event</p>
+<p>Args:
+  name (str): the name of the interface
+  events (DEvents): the list of events of the interface
+  methods (DMethods): the list of methods of the interface
+  description (str): a description of the interface</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DInterface.__init__', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DInterface.__init__" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">events</span><span class="o">=</span><span class="n">DEvents</span><span class="p">(),</span> <span class="n">methods</span><span class="o">=</span><span class="n">DMethods</span><span class="p">(),</span> <span class="n">description</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;Initializes the Event</span>
+<span class="sd">  Args:</span>
+<span class="sd">    name (str): the name of the interface</span>
+<span class="sd">    events (DEvents): the list of events of the interface</span>
+<span class="sd">    methods (DMethods): the list of methods of the interface</span>
+<span class="sd">    description (str): a description of the interface</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="n">NamedAndDescribed</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">description</span><span class="p">)</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__events</span> <span class="o">=</span> <span class="n">DEvents</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="n">events</span><span class="p">)</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__methods</span> <span class="o">=</span> <span class="n">DMethods</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="n">methods</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DInterface.dump">
+    <p>def <span class="ident">dump</span>(</p><p>self)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Converts the <code>supcon.util.Dumpable</code> into a 'simple' datastructure.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DInterface.dump', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DInterface.dump" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+  <span class="n">data</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">}</span>
+  <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">events</span><span class="p">:</span>
+    <span class="n">data</span><span class="p">[</span><span class="s1">&#39;events&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">events</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span>
+  <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">methods</span><span class="p">:</span>
+    <span class="n">data</span><span class="p">[</span><span class="s1">&#39;methods&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">methods</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span>
+  <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">description</span> <span class="o">!=</span> <span class="s1">&#39;&#39;</span><span class="p">:</span>
+    <span class="n">data</span><span class="p">[</span><span class="s1">&#39;description&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">description</span>
+  <span class="k">return</span> <span class="n">data</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DInterface.validateCall">
+    <p>def <span class="ident">validateCall</span>(</p><p>self, method, inArgs)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Asserts that the given method is a method of this interface and that
+the given arguments are input arguments of the method</p>
+<p>Args:
+  event (str): the event
+  inArgs (dict): the input arguments
+Raises:
+  AssertationError</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DInterface.validateCall', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DInterface.validateCall" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">validateCall</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">inArgs</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;Asserts that the given method is a method of this interface and that</span>
+<span class="sd">  the given arguments are input arguments of the method</span>
+<span class="sd">  Args:</span>
+<span class="sd">    event (str): the event</span>
+<span class="sd">    inArgs (dict): the input arguments</span>
+<span class="sd">  Raises:</span>
+<span class="sd">    AssertationError</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="n">method</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">method</span><span class="p">)</span>
+  <span class="k">if</span> <span class="n">method</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__methods</span><span class="p">:</span>
+    <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;method {} is unknown&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">))</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__methods</span><span class="p">[</span><span class="n">method</span><span class="p">]</span><span class="o">.</span><span class="n">validateInArgs</span><span class="p">(</span><span class="n">inArgs</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DInterface.validateEvent">
+    <p>def <span class="ident">validateEvent</span>(</p><p>self, event, args)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Validates that the given event is an event of this interface and that
+the given arguments are arguments of the event</p>
+<p>Args:
+  event (str): the event
+  args (dict): the arguments
+Raises:
+  ValueError</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DInterface.validateEvent', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DInterface.validateEvent" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">validateEvent</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;Validates that the given event is an event of this interface and that</span>
+<span class="sd">  the given arguments are arguments of the event</span>
+<span class="sd">  Args:</span>
+<span class="sd">    event (str): the event</span>
+<span class="sd">    args (dict): the arguments</span>
+<span class="sd">  Raises:</span>
+<span class="sd">    ValueError</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="n">event</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">event</span><span class="p">)</span>
+  <span class="k">if</span> <span class="n">event</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__events</span><span class="p">:</span>
+    <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;event {} is unknown&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">event</span><span class="p">))</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__events</span><span class="p">[</span><span class="n">event</span><span class="p">]</span><span class="o">.</span><span class="n">validateArgs</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DInterface.validateReturn">
+    <p>def <span class="ident">validateReturn</span>(</p><p>self, method, outArgs)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Asserts that the given method is a method of this interface and that
+the given arguments are output arguments of the method</p>
+<p>Args:
+  event (str): the event
+  outArgs (dict): the output arguments
+Raises:
+  AssertationError</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DInterface.validateReturn', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DInterface.validateReturn" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">validateReturn</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">outArgs</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;Asserts that the given method is a method of this interface and that</span>
+<span class="sd">  the given arguments are output arguments of the method</span>
+<span class="sd">  Args:</span>
+<span class="sd">    event (str): the event</span>
+<span class="sd">    outArgs (dict): the output arguments</span>
+<span class="sd">  Raises:</span>
+<span class="sd">    AssertationError</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="n">method</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">method</span><span class="p">)</span>
+  <span class="k">if</span> <span class="n">method</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__methods</span><span class="p">:</span>
+    <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;method {} is unknown&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">))</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__methods</span><span class="p">[</span><span class="n">method</span><span class="p">]</span><span class="o">.</span><span class="n">validateOutArgs</span><span class="p">(</span><span class="n">outArgs</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+      </div>
+      </div>
+      
+      <div class="item">
+      <p id="supcon.intf.DInterfaces" class="name">class <span class="ident">DInterfaces</span></p>
+      
+  
+    <div class="desc"><p>A readonly map of <a href="/screwerk/supcon/intf.m.md#supcon.intf.DInterface"><code>DInterface</code></a> instances</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DInterfaces', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DInterfaces" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">DInterfaces</span><span class="p">(</span><span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">NamedList</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;A readonly map of `supcon.intf.DInterface` instances&quot;&quot;&quot;</span>
+  <span class="n">vtype</span> <span class="o">=</span> <span class="n">DInterface</span>
+</pre></div>
+
+  </div>
+</div>
+
+
+      <div class="class">
+          <h3>Ancestors (in MRO)</h3>
+          <ul class="class_list">
+          <li><a href="/screwerk/supcon/intf.m.md#supcon.intf.DInterfaces">DInterfaces</a></li>
+          <li>supcon.util.NamedList</li>
+          <li>collections.abc.Mapping</li>
+          <li>collections.abc.Collection</li>
+          <li>collections.abc.Sized</li>
+          <li>collections.abc.Iterable</li>
+          <li>collections.abc.Container</li>
+          <li>supcon.util.Dumpable</li>
+          <li>abc.ABC</li>
+          <li>builtins.object</li>
+          </ul>
+          <h3>Class variables</h3>
+            <div class="item">
+            <p id="supcon.intf.DInterfaces.vtype" class="name">var <span class="ident">vtype</span></p>
+            
+
+            
+  
+  <div class="source_cont">
+</div>
+
+            </div>
+          <h3>Class Methods</h3>
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DInterfaces.load">
+    <p>def <span class="ident">load</span>(</p><p>cls, data)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Converts the given list of 'simple' datastructures <strong>data</strong> into an instance
+of <strong>cls</strong>, a subclass of <code>supcon.util.NamedList</code>.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DInterfaces.load', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DInterfaces.load" class="source">
+    <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">  Converts the given list of &#39;simple&#39; datastructures **data** into an instance</span>
+<span class="sd">  of **cls**, a subclass of `supcon.util.NamedList`.</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DInterfaces.to">
+    <p>def <span class="ident">to</span>(</p><p>cls, value)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>If the the <strong>value</strong> is an instance of <strong>cls</strong>, a subclass of
+<code>supcon.util.NamedList</code>, the value is returned. If value is not an instance
+of <strong>cls</strong> the method tries to convert the <strong>value</strong> into an instance of
+<strong>cls</strong>.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DInterfaces.to', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DInterfaces.to" class="source">
+    <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">to</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">  If the the **value** is an instance of **cls**, a subclass of</span>
+<span class="sd">  `supcon.util.NamedList`, the value is returned. If value is not an instance</span>
+<span class="sd">  of **cls** the method tries to convert the **value** into an instance of</span>
+<span class="sd">  **cls**.</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">return</span> <span class="n">value</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">cls</span><span class="p">)</span> <span class="k">else</span> <span class="bp">cls</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+          <h3>Methods</h3>
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DInterfaces.__init__">
+    <p>def <span class="ident">__init__</span>(</p><p>self, values=None)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Initializes the <code>supcon.util.NamedList</code> with the given list of <strong>values</strong>.</p>
+<p>An element of <strong>values</strong> must be of type <code>supcon.util.NamedList.vtype</code> or a
+'simple' datastructure that can be converted to an instance of
+<code>supcon.util.NamedList.vtype</code> by <code>supcon.util.NamedList.vtype</code>.load().</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DInterfaces.__init__', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DInterfaces.__init__" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">values</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">  Initializes the `supcon.util.NamedList` with the given list of **values**.</span>
+<span class="sd">  An element of **values** must be of type `supcon.util.NamedList.vtype` or a</span>
+<span class="sd">  &#39;simple&#39; datastructure that can be converted to an instance of</span>
+<span class="sd">  `supcon.util.NamedList.vtype` by `supcon.util.NamedList.vtype`.load().</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">if</span> <span class="n">values</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+    <span class="n">values</span> <span class="o">=</span> <span class="p">[]</span>
+  <span class="k">if</span> <span class="ow">not</span> <span class="nb">issubclass</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="p">,</span> <span class="n">Named</span><span class="p">):</span>
+    <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;the value type must be a subclass of Named&#39;</span><span class="p">)</span>
+  <span class="k">if</span> <span class="ow">not</span> <span class="nb">issubclass</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="p">,</span> <span class="n">Dumpable</span><span class="p">):</span>
+    <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;the value type must be a subclass of Dumpable&#39;</span><span class="p">)</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__values</span> <span class="o">=</span> <span class="n">collections</span><span class="o">.</span><span class="n">OrderedDict</span><span class="p">()</span>
+  <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">values</span><span class="p">:</span>
+    <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="p">):</span>
+      <span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+    <span class="k">if</span> <span class="n">value</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__values</span><span class="p">:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;value.name must be unique in the given list of values&#39;</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__values</span><span class="p">[</span><span class="n">value</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DInterfaces.dump">
+    <p>def <span class="ident">dump</span>(</p><p>self)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Converts the <code>supcon.util.NamedList</code> into a list of 'simple' datastructures.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DInterfaces.dump', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DInterfaces.dump" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">  Converts the `supcon.util.NamedList` into a list of &#39;simple&#39; datastructures.</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">return</span> <span class="p">[</span><span class="n">value</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span> <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()]</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DInterfaces.get">
+    <p>def <span class="ident">get</span>(</p><p>self, key, default=None)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>D.get(k[,d]) -&gt; D[k] if k in D, else d.  d defaults to None.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DInterfaces.get', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DInterfaces.get" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">get</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+    <span class="s1">&#39;D.get(k[,d]) -&gt; D[k] if k in D, else d.  d defaults to None.&#39;</span>
+    <span class="k">try</span><span class="p">:</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
+    <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
+        <span class="k">return</span> <span class="n">default</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DInterfaces.items">
+    <p>def <span class="ident">items</span>(</p><p>self)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>D.items() -&gt; a set-like object providing a view on D's items</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DInterfaces.items', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DInterfaces.items" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">items</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="s2">&quot;D.items() -&gt; a set-like object providing a view on D&#39;s items&quot;</span>
+    <span class="k">return</span> <span class="n">ItemsView</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DInterfaces.keys">
+    <p>def <span class="ident">keys</span>(</p><p>self)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>D.keys() -&gt; a set-like object providing a view on D's keys</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DInterfaces.keys', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DInterfaces.keys" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">keys</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="s2">&quot;D.keys() -&gt; a set-like object providing a view on D&#39;s keys&quot;</span>
+    <span class="k">return</span> <span class="n">KeysView</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DInterfaces.values">
+    <p>def <span class="ident">values</span>(</p><p>self)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>D.values() -&gt; an object providing a view on D's values</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DInterfaces.values', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DInterfaces.values" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">values</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="s2">&quot;D.values() -&gt; an object providing a view on D&#39;s values&quot;</span>
+    <span class="k">return</span> <span class="n">ValuesView</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+      </div>
+      </div>
+      
+      <div class="item">
+      <p id="supcon.intf.DMethod" class="name">class <span class="ident">DMethod</span></p>
+      
+  
+    <div class="desc"><p>A DMethod that can be called on an Object on the Bus</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DMethod', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DMethod" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">DMethod</span><span class="p">(</span><span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">Dumpable</span><span class="p">,</span> <span class="n">NamedAndDescribed</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;A DMethod that can be called on an Object on the Bus&quot;&quot;&quot;</span>
+
+  <span class="n">regex</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s1">&#39;[a-zA-Z0-9]+&#39;</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">inArgs</span><span class="o">=</span><span class="n">DArguments</span><span class="p">(),</span> <span class="n">outArgs</span><span class="o">=</span><span class="n">DArguments</span><span class="p">(),</span> <span class="n">description</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Initializes the Event</span>
+
+<span class="sd">    Args:</span>
+<span class="sd">      name (str): the name of the method</span>
+<span class="sd">      inArgs (DArguments): the list of input arguments of the method</span>
+<span class="sd">      outArgs (DArguments): the list of output arguments of the method</span>
+<span class="sd">      description (str): a description of the method</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="n">NamedAndDescribed</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">description</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__inArgs</span> <span class="o">=</span> <span class="n">DArguments</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="n">inArgs</span><span class="p">)</span><span class="c1">#</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__outArgs</span> <span class="o">=</span> <span class="n">DArguments</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="n">outArgs</span><span class="p">)</span>
+
+  <span class="nd">@property</span>
+  <span class="k">def</span> <span class="nf">inArgs</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">DArguments</span><span class="p">:</span>
+    <span class="sd">&quot;&quot;&quot;DArguments: The input arguments of the method&quot;&quot;&quot;</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__inArgs</span>
+
+  <span class="nd">@property</span>
+  <span class="k">def</span> <span class="nf">outArgs</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">DArguments</span><span class="p">:</span>
+    <span class="sd">&quot;&quot;&quot;DArguments: The output arguments of the method&quot;&quot;&quot;</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__outArgs</span>
+
+  <span class="k">def</span> <span class="nf">validateInArgs</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">inArgs</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Validates the given argument Mapping. Raises an ValueError if validation fails</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">inArgs</span><span class="p">:</span>
+      <span class="k">if</span> <span class="n">arg</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__inArgs</span><span class="p">:</span>
+        <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;method {} has no input argument {}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">arg</span><span class="p">))</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__inArgs</span><span class="p">[</span><span class="n">arg</span><span class="p">]</span><span class="o">.</span><span class="n">validate</span><span class="p">(</span><span class="n">inArgs</span><span class="p">[</span><span class="n">arg</span><span class="p">])</span>
+    <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__inArgs</span><span class="p">:</span>
+      <span class="k">if</span> <span class="n">arg</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">inArgs</span><span class="p">:</span>
+        <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;method {} needs input argument {}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">arg</span><span class="p">))</span>
+
+  <span class="k">def</span> <span class="nf">validateOutArgs</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">outArgs</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Validates the given argument Mapping. Raises an ValueError if validation fails</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">outArgs</span><span class="p">:</span>
+      <span class="k">if</span> <span class="n">arg</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__outArgs</span><span class="p">:</span>
+        <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;method {} has no output argument {}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">arg</span><span class="p">))</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__outArgs</span><span class="p">[</span><span class="n">arg</span><span class="p">]</span><span class="o">.</span><span class="n">validate</span><span class="p">(</span><span class="n">outArgs</span><span class="p">[</span><span class="n">arg</span><span class="p">])</span>
+    <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__outArgs</span><span class="p">:</span>
+      <span class="k">if</span> <span class="n">arg</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">outArgs</span><span class="p">:</span>
+        <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;method {} needs output argument {}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">arg</span><span class="p">))</span>
+
+  <span class="k">def</span> <span class="nf">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="n">data</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">}</span>
+    <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">inArgs</span><span class="p">:</span>
+      <span class="n">data</span><span class="p">[</span><span class="s1">&#39;inArgs&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">inArgs</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span>
+    <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">outArgs</span><span class="p">:</span>
+      <span class="n">data</span><span class="p">[</span><span class="s1">&#39;outArgs&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">outArgs</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span>
+    <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">description</span> <span class="o">!=</span> <span class="s1">&#39;&#39;</span><span class="p">:</span>
+      <span class="n">data</span><span class="p">[</span><span class="s1">&#39;description&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">description</span>
+    <span class="k">return</span> <span class="n">data</span>
+
+  <span class="nd">@classmethod</span>
+  <span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+    <span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="o">**</span><span class="n">data</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+
+      <div class="class">
+          <h3>Ancestors (in MRO)</h3>
+          <ul class="class_list">
+          <li><a href="/screwerk/supcon/intf.m.md#supcon.intf.DMethod">DMethod</a></li>
+          <li>supcon.util.Dumpable</li>
+          <li><a href="/screwerk/supcon/intf.m.md#supcon.intf.NamedAndDescribed">NamedAndDescribed</a></li>
+          <li><a href="/screwerk/supcon/intf.m.md#supcon.intf.Named">Named</a></li>
+          <li>supcon.util.Named</li>
+          <li>abc.ABC</li>
+          <li>builtins.object</li>
+          </ul>
+          <h3>Class variables</h3>
+            <div class="item">
+            <p id="supcon.intf.DMethod.regex" class="name">var <span class="ident">regex</span></p>
+            
+
+            
+  
+  <div class="source_cont">
+</div>
+
+            </div>
+          <h3>Class Methods</h3>
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DMethod.load">
+    <p>def <span class="ident">load</span>(</p><p>cls, data)</p>
+    </div>
+    
+
+    
+  
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DMethod.load', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DMethod.load" class="source">
+    <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+  <span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="o">**</span><span class="n">data</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DMethod.toDescription">
+    <p>def <span class="ident">toDescription</span>(</p><p>cls, value)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Converts the value into a description. If this is impossible a ValueError
+is raised.</p>
+<p>Args:
+  value (any): the value
+Raises:
+  ValueError</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DMethod.toDescription', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DMethod.toDescription" class="source">
+    <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">toDescription</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
+  <span class="sd">&quot;&quot;&quot;Converts the value into a description. If this is impossible a ValueError</span>
+<span class="sd">  is raised.</span>
+<span class="sd">  Args:</span>
+<span class="sd">    value (any): the value</span>
+<span class="sd">  Raises:</span>
+<span class="sd">    ValueError</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DMethod.toName">
+    <p>def <span class="ident">toName</span>(</p><p>cls, value)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Converts the value into a name. If this is impossible a ValueError is
+raised.</p>
+<p>Args:
+  value (any): the value
+Raises:
+  ValueError</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DMethod.toName', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DMethod.toName" class="source">
+    <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">toName</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
+  <span class="sd">&quot;&quot;&quot;Converts the value into a name. If this is impossible a ValueError is</span>
+<span class="sd">  raised.</span>
+<span class="sd">  Args:</span>
+<span class="sd">    value (any): the value</span>
+<span class="sd">  Raises:</span>
+<span class="sd">    ValueError</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="n">value</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+  <span class="k">if</span> <span class="ow">not</span> <span class="bp">cls</span><span class="o">.</span><span class="n">regex</span><span class="o">.</span><span class="n">fullmatch</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
+    <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;value {} must match {} fully&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">cls</span><span class="o">.</span><span class="n">regex</span><span class="o">.</span><span class="n">pattern</span><span class="p">))</span>
+  <span class="k">return</span> <span class="n">value</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+          <h3>Instance variables</h3>
+            <div class="item">
+            <p id="supcon.intf.DMethod.description" class="name">var <span class="ident">description</span></p>
+            
+    <p class="inheritance">
+     <strong>Inheritance:</strong>
+       <code><a href="/screwerk/supcon/intf.m.md#supcon.intf.NamedAndDescribed">NamedAndDescribed</a></code>.<code><a href="/screwerk/supcon/intf.m.md#supcon.intf.NamedAndDescribed.description">description</a></code>
+    </p>
+
+            
+  
+    <div class="desc inherited"><p>str: a description</p></div>
+  <div class="source_cont">
+</div>
+
+            </div>
+            <div class="item">
+            <p id="supcon.intf.DMethod.inArgs" class="name">var <span class="ident">inArgs</span></p>
+            
+
+            
+  
+    <div class="desc"><p>DArguments: The input arguments of the method</p></div>
+  <div class="source_cont">
+</div>
+
+            </div>
+            <div class="item">
+            <p id="supcon.intf.DMethod.name" class="name">var <span class="ident">name</span></p>
+            
+
+            
+  
+    <div class="desc"><p>str: the name</p></div>
+  <div class="source_cont">
+</div>
+
+            </div>
+            <div class="item">
+            <p id="supcon.intf.DMethod.outArgs" class="name">var <span class="ident">outArgs</span></p>
+            
+
+            
+  
+    <div class="desc"><p>DArguments: The output arguments of the method</p></div>
+  <div class="source_cont">
+</div>
+
+            </div>
+          <h3>Methods</h3>
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DMethod.__init__">
+    <p>def <span class="ident">__init__</span>(</p><p>self, name, inArgs=supcon.intf.DArguments(), outArgs=supcon.intf.DArguments(), description=&#39;&#39;)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Initializes the Event</p>
+<p>Args:
+  name (str): the name of the method
+  inArgs (DArguments): the list of input arguments of the method
+  outArgs (DArguments): the list of output arguments of the method
+  description (str): a description of the method</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DMethod.__init__', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DMethod.__init__" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">inArgs</span><span class="o">=</span><span class="n">DArguments</span><span class="p">(),</span> <span class="n">outArgs</span><span class="o">=</span><span class="n">DArguments</span><span class="p">(),</span> <span class="n">description</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;Initializes the Event</span>
+<span class="sd">  Args:</span>
+<span class="sd">    name (str): the name of the method</span>
+<span class="sd">    inArgs (DArguments): the list of input arguments of the method</span>
+<span class="sd">    outArgs (DArguments): the list of output arguments of the method</span>
+<span class="sd">    description (str): a description of the method</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="n">NamedAndDescribed</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">description</span><span class="p">)</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__inArgs</span> <span class="o">=</span> <span class="n">DArguments</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="n">inArgs</span><span class="p">)</span><span class="c1">#</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__outArgs</span> <span class="o">=</span> <span class="n">DArguments</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="n">outArgs</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DMethod.dump">
+    <p>def <span class="ident">dump</span>(</p><p>self)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Converts the <code>supcon.util.Dumpable</code> into a 'simple' datastructure.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DMethod.dump', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DMethod.dump" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+  <span class="n">data</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">}</span>
+  <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">inArgs</span><span class="p">:</span>
+    <span class="n">data</span><span class="p">[</span><span class="s1">&#39;inArgs&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">inArgs</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span>
+  <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">outArgs</span><span class="p">:</span>
+    <span class="n">data</span><span class="p">[</span><span class="s1">&#39;outArgs&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">outArgs</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span>
+  <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">description</span> <span class="o">!=</span> <span class="s1">&#39;&#39;</span><span class="p">:</span>
+    <span class="n">data</span><span class="p">[</span><span class="s1">&#39;description&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">description</span>
+  <span class="k">return</span> <span class="n">data</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DMethod.validateInArgs">
+    <p>def <span class="ident">validateInArgs</span>(</p><p>self, inArgs)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Validates the given argument Mapping. Raises an ValueError if validation fails</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DMethod.validateInArgs', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DMethod.validateInArgs" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">validateInArgs</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">inArgs</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;Validates the given argument Mapping. Raises an ValueError if validation fails</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">inArgs</span><span class="p">:</span>
+    <span class="k">if</span> <span class="n">arg</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__inArgs</span><span class="p">:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;method {} has no input argument {}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">arg</span><span class="p">))</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__inArgs</span><span class="p">[</span><span class="n">arg</span><span class="p">]</span><span class="o">.</span><span class="n">validate</span><span class="p">(</span><span class="n">inArgs</span><span class="p">[</span><span class="n">arg</span><span class="p">])</span>
+  <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__inArgs</span><span class="p">:</span>
+    <span class="k">if</span> <span class="n">arg</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">inArgs</span><span class="p">:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;method {} needs input argument {}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">arg</span><span class="p">))</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DMethod.validateOutArgs">
+    <p>def <span class="ident">validateOutArgs</span>(</p><p>self, outArgs)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Validates the given argument Mapping. Raises an ValueError if validation fails</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DMethod.validateOutArgs', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DMethod.validateOutArgs" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">validateOutArgs</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">outArgs</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;Validates the given argument Mapping. Raises an ValueError if validation fails</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">outArgs</span><span class="p">:</span>
+    <span class="k">if</span> <span class="n">arg</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__outArgs</span><span class="p">:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;method {} has no output argument {}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">arg</span><span class="p">))</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__outArgs</span><span class="p">[</span><span class="n">arg</span><span class="p">]</span><span class="o">.</span><span class="n">validate</span><span class="p">(</span><span class="n">outArgs</span><span class="p">[</span><span class="n">arg</span><span class="p">])</span>
+  <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__outArgs</span><span class="p">:</span>
+    <span class="k">if</span> <span class="n">arg</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">outArgs</span><span class="p">:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;method {} needs output argument {}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">arg</span><span class="p">))</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+      </div>
+      </div>
+      
+      <div class="item">
+      <p id="supcon.intf.DMethods" class="name">class <span class="ident">DMethods</span></p>
+      
+  
+    <div class="desc"><p>A readonly map of <a href="/screwerk/supcon/intf.m.md#supcon.intf.DMethod"><code>DMethod</code></a> instances</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DMethods', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DMethods" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">DMethods</span><span class="p">(</span><span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">NamedList</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;A readonly map of `supcon.intf.DMethod` instances&quot;&quot;&quot;</span>
+  <span class="n">vtype</span> <span class="o">=</span> <span class="n">DMethod</span>
+</pre></div>
+
+  </div>
+</div>
+
+
+      <div class="class">
+          <h3>Ancestors (in MRO)</h3>
+          <ul class="class_list">
+          <li><a href="/screwerk/supcon/intf.m.md#supcon.intf.DMethods">DMethods</a></li>
+          <li>supcon.util.NamedList</li>
+          <li>collections.abc.Mapping</li>
+          <li>collections.abc.Collection</li>
+          <li>collections.abc.Sized</li>
+          <li>collections.abc.Iterable</li>
+          <li>collections.abc.Container</li>
+          <li>supcon.util.Dumpable</li>
+          <li>abc.ABC</li>
+          <li>builtins.object</li>
+          </ul>
+          <h3>Class variables</h3>
+            <div class="item">
+            <p id="supcon.intf.DMethods.vtype" class="name">var <span class="ident">vtype</span></p>
+            
+
+            
+  
+  <div class="source_cont">
+</div>
+
+            </div>
+          <h3>Class Methods</h3>
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DMethods.load">
+    <p>def <span class="ident">load</span>(</p><p>cls, data)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Converts the given list of 'simple' datastructures <strong>data</strong> into an instance
+of <strong>cls</strong>, a subclass of <code>supcon.util.NamedList</code>.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DMethods.load', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DMethods.load" class="source">
+    <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">  Converts the given list of &#39;simple&#39; datastructures **data** into an instance</span>
+<span class="sd">  of **cls**, a subclass of `supcon.util.NamedList`.</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DMethods.to">
+    <p>def <span class="ident">to</span>(</p><p>cls, value)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>If the the <strong>value</strong> is an instance of <strong>cls</strong>, a subclass of
+<code>supcon.util.NamedList</code>, the value is returned. If value is not an instance
+of <strong>cls</strong> the method tries to convert the <strong>value</strong> into an instance of
+<strong>cls</strong>.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DMethods.to', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DMethods.to" class="source">
+    <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">to</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">  If the the **value** is an instance of **cls**, a subclass of</span>
+<span class="sd">  `supcon.util.NamedList`, the value is returned. If value is not an instance</span>
+<span class="sd">  of **cls** the method tries to convert the **value** into an instance of</span>
+<span class="sd">  **cls**.</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">return</span> <span class="n">value</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">cls</span><span class="p">)</span> <span class="k">else</span> <span class="bp">cls</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+          <h3>Methods</h3>
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DMethods.__init__">
+    <p>def <span class="ident">__init__</span>(</p><p>self, values=None)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Initializes the <code>supcon.util.NamedList</code> with the given list of <strong>values</strong>.</p>
+<p>An element of <strong>values</strong> must be of type <code>supcon.util.NamedList.vtype</code> or a
+'simple' datastructure that can be converted to an instance of
+<code>supcon.util.NamedList.vtype</code> by <code>supcon.util.NamedList.vtype</code>.load().</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DMethods.__init__', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DMethods.__init__" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">values</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">  Initializes the `supcon.util.NamedList` with the given list of **values**.</span>
+<span class="sd">  An element of **values** must be of type `supcon.util.NamedList.vtype` or a</span>
+<span class="sd">  &#39;simple&#39; datastructure that can be converted to an instance of</span>
+<span class="sd">  `supcon.util.NamedList.vtype` by `supcon.util.NamedList.vtype`.load().</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">if</span> <span class="n">values</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+    <span class="n">values</span> <span class="o">=</span> <span class="p">[]</span>
+  <span class="k">if</span> <span class="ow">not</span> <span class="nb">issubclass</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="p">,</span> <span class="n">Named</span><span class="p">):</span>
+    <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;the value type must be a subclass of Named&#39;</span><span class="p">)</span>
+  <span class="k">if</span> <span class="ow">not</span> <span class="nb">issubclass</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="p">,</span> <span class="n">Dumpable</span><span class="p">):</span>
+    <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;the value type must be a subclass of Dumpable&#39;</span><span class="p">)</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__values</span> <span class="o">=</span> <span class="n">collections</span><span class="o">.</span><span class="n">OrderedDict</span><span class="p">()</span>
+  <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">values</span><span class="p">:</span>
+    <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="p">):</span>
+      <span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+    <span class="k">if</span> <span class="n">value</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__values</span><span class="p">:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;value.name must be unique in the given list of values&#39;</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__values</span><span class="p">[</span><span class="n">value</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DMethods.dump">
+    <p>def <span class="ident">dump</span>(</p><p>self)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Converts the <code>supcon.util.NamedList</code> into a list of 'simple' datastructures.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DMethods.dump', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DMethods.dump" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">  Converts the `supcon.util.NamedList` into a list of &#39;simple&#39; datastructures.</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">return</span> <span class="p">[</span><span class="n">value</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span> <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()]</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DMethods.get">
+    <p>def <span class="ident">get</span>(</p><p>self, key, default=None)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>D.get(k[,d]) -&gt; D[k] if k in D, else d.  d defaults to None.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DMethods.get', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DMethods.get" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">get</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+    <span class="s1">&#39;D.get(k[,d]) -&gt; D[k] if k in D, else d.  d defaults to None.&#39;</span>
+    <span class="k">try</span><span class="p">:</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
+    <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
+        <span class="k">return</span> <span class="n">default</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DMethods.items">
+    <p>def <span class="ident">items</span>(</p><p>self)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>D.items() -&gt; a set-like object providing a view on D's items</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DMethods.items', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DMethods.items" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">items</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="s2">&quot;D.items() -&gt; a set-like object providing a view on D&#39;s items&quot;</span>
+    <span class="k">return</span> <span class="n">ItemsView</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DMethods.keys">
+    <p>def <span class="ident">keys</span>(</p><p>self)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>D.keys() -&gt; a set-like object providing a view on D's keys</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DMethods.keys', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DMethods.keys" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">keys</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="s2">&quot;D.keys() -&gt; a set-like object providing a view on D&#39;s keys&quot;</span>
+    <span class="k">return</span> <span class="n">KeysView</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DMethods.values">
+    <p>def <span class="ident">values</span>(</p><p>self)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>D.values() -&gt; an object providing a view on D's values</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DMethods.values', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DMethods.values" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">values</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="s2">&quot;D.values() -&gt; an object providing a view on D&#39;s values&quot;</span>
+    <span class="k">return</span> <span class="n">ValuesView</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+      </div>
+      </div>
+      
+      <div class="item">
+      <p id="supcon.intf.DNode" class="name">class <span class="ident">DNode</span></p>
+      
+  
+    <div class="desc"><p>A named readonly map of <a href="/screwerk/supcon/intf.m.md#supcon.intf.DPath"><code>DPath</code></a> instances</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNode', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DNode" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">DNode</span><span class="p">(</span><span class="n">Named</span><span class="p">,</span> <span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">NamedList</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;A named readonly map of `supcon.intf.DPath` instances&quot;&quot;&quot;</span>
+
+  <span class="n">vtype</span> <span class="o">=</span> <span class="n">DPath</span>
+  <span class="n">regex</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s1">&#39;.+&#39;</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">paths</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Initializes the Path instance</span>
+
+<span class="sd">    Args:</span>
+<span class="sd">      name (str): the name of the argument</span>
+<span class="sd">      paths (): ...</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">if</span> <span class="n">paths</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+      <span class="n">paths</span> <span class="o">=</span> <span class="p">[]</span>
+
+    <span class="n">Named</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
+    <span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">NamedList</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">paths</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="k">return</span> <span class="p">{</span>
+      <span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
+      <span class="s1">&#39;paths&#39;</span><span class="p">:</span> <span class="p">[</span><span class="n">value</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span> <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()]</span>
+    <span class="p">}</span>
+
+  <span class="nd">@classmethod</span>
+  <span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s1">&#39;DPath&#39;</span><span class="p">:</span>
+    <span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="o">**</span><span class="n">data</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">hasPath</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
+    <span class="k">return</span> <span class="n">path</span> <span class="ow">in</span> <span class="bp">self</span>
+
+  <span class="k">def</span> <span class="nf">hasIntf</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">intf</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
+    <span class="k">return</span> <span class="n">path</span> <span class="ow">in</span> <span class="bp">self</span> <span class="ow">and</span> <span class="n">intf</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">[</span><span class="n">path</span><span class="p">]</span>
+
+  <span class="k">def</span> <span class="nf">addPath</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s1">&#39;DNode&#39;</span><span class="p">:</span>
+    <span class="k">if</span> <span class="n">path</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;path {} on node {} already exists&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+    <span class="n">paths</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">(),</span> <span class="p">[</span><span class="n">DPath</span><span class="p">(</span><span class="n">path</span><span class="p">)])</span>
+    <span class="k">return</span> <span class="n">DNode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">paths</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">delPath</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s1">&#39;DNode&#39;</span><span class="p">:</span>
+    <span class="k">if</span> <span class="n">path</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;path {} on node {} does not exist&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+    <span class="k">if</span> <span class="bp">self</span><span class="p">[</span><span class="n">path</span><span class="p">]:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;path {} on node {} is not empty&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+    <span class="n">paths</span> <span class="o">=</span> <span class="p">(</span><span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="n">path</span><span class="p">)</span>
+    <span class="k">return</span> <span class="n">DNode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">paths</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">addInterface</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">interface</span><span class="p">:</span> <span class="n">DInterface</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s1">&#39;DNode&#39;</span><span class="p">:</span>
+    <span class="k">if</span> <span class="n">path</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;path {} on node {} does not exist&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+    <span class="k">if</span> <span class="n">interface</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">[</span><span class="n">path</span><span class="p">]:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;interface {} at path {} on node {} already exists&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">interface</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+    <span class="n">paths</span> <span class="o">=</span> <span class="p">(</span><span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="n">path</span><span class="p">)</span>
+    <span class="n">paths</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="n">paths</span><span class="p">,</span> <span class="p">[</span><span class="bp">self</span><span class="p">[</span><span class="n">path</span><span class="p">]</span><span class="o">.</span><span class="n">addInterface</span><span class="p">(</span><span class="n">interface</span><span class="p">)])</span>
+    <span class="k">return</span> <span class="n">DNode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">paths</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">delInterface</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">interface</span><span class="p">:</span> <span class="n">DInterface</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s1">&#39;DNode&#39;</span><span class="p">:</span>
+    <span class="k">if</span> <span class="n">path</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;path {} on node {} does not exist&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+    <span class="k">if</span> <span class="n">interface</span><span class="o">.</span><span class="n">name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">[</span><span class="n">path</span><span class="p">]:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;interface {} at path {} on node {} does not exist&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">interface</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+    <span class="n">paths</span> <span class="o">=</span> <span class="p">(</span><span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="n">path</span><span class="p">)</span>
+    <span class="n">paths</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="n">paths</span><span class="p">,</span> <span class="p">[</span><span class="bp">self</span><span class="p">[</span><span class="n">path</span><span class="p">]</span><span class="o">.</span><span class="n">delInterface</span><span class="p">(</span><span class="n">interface</span><span class="p">)])</span>
+    <span class="k">return</span> <span class="n">DNode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">paths</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+
+      <div class="class">
+          <h3>Ancestors (in MRO)</h3>
+          <ul class="class_list">
+          <li><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNode">DNode</a></li>
+          <li><a href="/screwerk/supcon/intf.m.md#supcon.intf.Named">Named</a></li>
+          <li>supcon.util.Named</li>
+          <li>supcon.util.NamedList</li>
+          <li>collections.abc.Mapping</li>
+          <li>collections.abc.Collection</li>
+          <li>collections.abc.Sized</li>
+          <li>collections.abc.Iterable</li>
+          <li>collections.abc.Container</li>
+          <li>supcon.util.Dumpable</li>
+          <li>abc.ABC</li>
+          <li>builtins.object</li>
+          </ul>
+          <h3>Class variables</h3>
+            <div class="item">
+            <p id="supcon.intf.DNode.regex" class="name">var <span class="ident">regex</span></p>
+            
+
+            
+  
+  <div class="source_cont">
+</div>
+
+            </div>
+            <div class="item">
+            <p id="supcon.intf.DNode.vtype" class="name">var <span class="ident">vtype</span></p>
+            
+
+            
+  
+  <div class="source_cont">
+</div>
+
+            </div>
+          <h3>Class Methods</h3>
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DNode.load">
+    <p>def <span class="ident">load</span>(</p><p>cls, data)</p>
+    </div>
+    
+
+    
+  
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNode.load', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DNode.load" class="source">
+    <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s1">&#39;DPath&#39;</span><span class="p">:</span>
+  <span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="o">**</span><span class="n">data</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DNode.to">
+    <p>def <span class="ident">to</span>(</p><p>cls, value)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>If the the <strong>value</strong> is an instance of <strong>cls</strong>, a subclass of
+<code>supcon.util.NamedList</code>, the value is returned. If value is not an instance
+of <strong>cls</strong> the method tries to convert the <strong>value</strong> into an instance of
+<strong>cls</strong>.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNode.to', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DNode.to" class="source">
+    <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">to</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">  If the the **value** is an instance of **cls**, a subclass of</span>
+<span class="sd">  `supcon.util.NamedList`, the value is returned. If value is not an instance</span>
+<span class="sd">  of **cls** the method tries to convert the **value** into an instance of</span>
+<span class="sd">  **cls**.</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">return</span> <span class="n">value</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">cls</span><span class="p">)</span> <span class="k">else</span> <span class="bp">cls</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DNode.toName">
+    <p>def <span class="ident">toName</span>(</p><p>cls, value)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Converts the value into a name. If this is impossible a ValueError is
+raised.</p>
+<p>Args:
+  value (any): the value
+Raises:
+  ValueError</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNode.toName', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DNode.toName" class="source">
+    <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">toName</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
+  <span class="sd">&quot;&quot;&quot;Converts the value into a name. If this is impossible a ValueError is</span>
+<span class="sd">  raised.</span>
+<span class="sd">  Args:</span>
+<span class="sd">    value (any): the value</span>
+<span class="sd">  Raises:</span>
+<span class="sd">    ValueError</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="n">value</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+  <span class="k">if</span> <span class="ow">not</span> <span class="bp">cls</span><span class="o">.</span><span class="n">regex</span><span class="o">.</span><span class="n">fullmatch</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
+    <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;value {} must match {} fully&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">cls</span><span class="o">.</span><span class="n">regex</span><span class="o">.</span><span class="n">pattern</span><span class="p">))</span>
+  <span class="k">return</span> <span class="n">value</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+          <h3>Instance variables</h3>
+            <div class="item">
+            <p id="supcon.intf.DNode.name" class="name">var <span class="ident">name</span></p>
+            
+    <p class="inheritance">
+     <strong>Inheritance:</strong>
+       <code><a href="/screwerk/supcon/intf.m.md#supcon.intf.Named">Named</a></code>.<code><a href="/screwerk/supcon/intf.m.md#supcon.intf.Named.name">name</a></code>
+    </p>
+
+            
+  
+    <div class="desc inherited"><p>str: the name</p></div>
+  <div class="source_cont">
+</div>
+
+            </div>
+          <h3>Methods</h3>
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DNode.__init__">
+    <p>def <span class="ident">__init__</span>(</p><p>self, name, paths=None)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Initializes the Path instance</p>
+<p>Args:
+  name (str): the name of the argument
+  paths (): ...</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNode.__init__', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DNode.__init__" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">paths</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;Initializes the Path instance</span>
+<span class="sd">  Args:</span>
+<span class="sd">    name (str): the name of the argument</span>
+<span class="sd">    paths (): ...</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">if</span> <span class="n">paths</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+    <span class="n">paths</span> <span class="o">=</span> <span class="p">[]</span>
+  <span class="n">Named</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
+  <span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">NamedList</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">paths</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DNode.addInterface">
+    <p>def <span class="ident">addInterface</span>(</p><p>self, path, interface)</p>
+    </div>
+    
+
+    
+  
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNode.addInterface', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DNode.addInterface" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">addInterface</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">interface</span><span class="p">:</span> <span class="n">DInterface</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s1">&#39;DNode&#39;</span><span class="p">:</span>
+  <span class="k">if</span> <span class="n">path</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+    <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;path {} on node {} does not exist&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+  <span class="k">if</span> <span class="n">interface</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">[</span><span class="n">path</span><span class="p">]:</span>
+    <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;interface {} at path {} on node {} already exists&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">interface</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+  <span class="n">paths</span> <span class="o">=</span> <span class="p">(</span><span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="n">path</span><span class="p">)</span>
+  <span class="n">paths</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="n">paths</span><span class="p">,</span> <span class="p">[</span><span class="bp">self</span><span class="p">[</span><span class="n">path</span><span class="p">]</span><span class="o">.</span><span class="n">addInterface</span><span class="p">(</span><span class="n">interface</span><span class="p">)])</span>
+  <span class="k">return</span> <span class="n">DNode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">paths</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DNode.addPath">
+    <p>def <span class="ident">addPath</span>(</p><p>self, path)</p>
+    </div>
+    
+
+    
+  
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNode.addPath', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DNode.addPath" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">addPath</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s1">&#39;DNode&#39;</span><span class="p">:</span>
+  <span class="k">if</span> <span class="n">path</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+    <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;path {} on node {} already exists&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+  <span class="n">paths</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">(),</span> <span class="p">[</span><span class="n">DPath</span><span class="p">(</span><span class="n">path</span><span class="p">)])</span>
+  <span class="k">return</span> <span class="n">DNode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">paths</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DNode.delInterface">
+    <p>def <span class="ident">delInterface</span>(</p><p>self, path, interface)</p>
+    </div>
+    
+
+    
+  
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNode.delInterface', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DNode.delInterface" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">delInterface</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">interface</span><span class="p">:</span> <span class="n">DInterface</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s1">&#39;DNode&#39;</span><span class="p">:</span>
+  <span class="k">if</span> <span class="n">path</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+    <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;path {} on node {} does not exist&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+  <span class="k">if</span> <span class="n">interface</span><span class="o">.</span><span class="n">name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">[</span><span class="n">path</span><span class="p">]:</span>
+    <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;interface {} at path {} on node {} does not exist&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">interface</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+  <span class="n">paths</span> <span class="o">=</span> <span class="p">(</span><span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="n">path</span><span class="p">)</span>
+  <span class="n">paths</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="n">paths</span><span class="p">,</span> <span class="p">[</span><span class="bp">self</span><span class="p">[</span><span class="n">path</span><span class="p">]</span><span class="o">.</span><span class="n">delInterface</span><span class="p">(</span><span class="n">interface</span><span class="p">)])</span>
+  <span class="k">return</span> <span class="n">DNode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">paths</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DNode.delPath">
+    <p>def <span class="ident">delPath</span>(</p><p>self, path)</p>
+    </div>
+    
+
+    
+  
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNode.delPath', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DNode.delPath" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">delPath</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s1">&#39;DNode&#39;</span><span class="p">:</span>
+  <span class="k">if</span> <span class="n">path</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+    <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;path {} on node {} does not exist&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+  <span class="k">if</span> <span class="bp">self</span><span class="p">[</span><span class="n">path</span><span class="p">]:</span>
+    <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;path {} on node {} is not empty&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+  <span class="n">paths</span> <span class="o">=</span> <span class="p">(</span><span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="n">path</span><span class="p">)</span>
+  <span class="k">return</span> <span class="n">DNode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">paths</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DNode.dump">
+    <p>def <span class="ident">dump</span>(</p><p>self)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Converts the <code>supcon.util.NamedList</code> into a list of 'simple' datastructures.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNode.dump', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DNode.dump" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+  <span class="k">return</span> <span class="p">{</span>
+    <span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
+    <span class="s1">&#39;paths&#39;</span><span class="p">:</span> <span class="p">[</span><span class="n">value</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span> <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()]</span>
+  <span class="p">}</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DNode.get">
+    <p>def <span class="ident">get</span>(</p><p>self, key, default=None)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>D.get(k[,d]) -&gt; D[k] if k in D, else d.  d defaults to None.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNode.get', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DNode.get" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">get</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+    <span class="s1">&#39;D.get(k[,d]) -&gt; D[k] if k in D, else d.  d defaults to None.&#39;</span>
+    <span class="k">try</span><span class="p">:</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
+    <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
+        <span class="k">return</span> <span class="n">default</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DNode.hasIntf">
+    <p>def <span class="ident">hasIntf</span>(</p><p>self, path, intf)</p>
+    </div>
+    
+
+    
+  
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNode.hasIntf', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DNode.hasIntf" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">hasIntf</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">intf</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
+  <span class="k">return</span> <span class="n">path</span> <span class="ow">in</span> <span class="bp">self</span> <span class="ow">and</span> <span class="n">intf</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">[</span><span class="n">path</span><span class="p">]</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DNode.hasPath">
+    <p>def <span class="ident">hasPath</span>(</p><p>self, path)</p>
+    </div>
+    
+
+    
+  
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNode.hasPath', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DNode.hasPath" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">hasPath</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
+  <span class="k">return</span> <span class="n">path</span> <span class="ow">in</span> <span class="bp">self</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DNode.items">
+    <p>def <span class="ident">items</span>(</p><p>self)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>D.items() -&gt; a set-like object providing a view on D's items</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNode.items', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DNode.items" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">items</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="s2">&quot;D.items() -&gt; a set-like object providing a view on D&#39;s items&quot;</span>
+    <span class="k">return</span> <span class="n">ItemsView</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DNode.keys">
+    <p>def <span class="ident">keys</span>(</p><p>self)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>D.keys() -&gt; a set-like object providing a view on D's keys</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNode.keys', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DNode.keys" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">keys</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="s2">&quot;D.keys() -&gt; a set-like object providing a view on D&#39;s keys&quot;</span>
+    <span class="k">return</span> <span class="n">KeysView</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DNode.values">
+    <p>def <span class="ident">values</span>(</p><p>self)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>D.values() -&gt; an object providing a view on D's values</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNode.values', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DNode.values" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">values</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="s2">&quot;D.values() -&gt; an object providing a view on D&#39;s values&quot;</span>
+    <span class="k">return</span> <span class="n">ValuesView</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+      </div>
+      </div>
+      
+      <div class="item">
+      <p id="supcon.intf.DNodes" class="name">class <span class="ident">DNodes</span></p>
+      
+  
+    <div class="desc"><p>A readonly map of <a href="/screwerk/supcon/intf.m.md#supcon.intf.DNode"><code>DNode</code></a> instances</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNodes', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DNodes" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">DNodes</span><span class="p">(</span><span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">NamedList</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;A readonly map of `supcon.intf.DNode` instances&quot;&quot;&quot;</span>
+  <span class="n">vtype</span> <span class="o">=</span> <span class="n">DNode</span>
+
+  <span class="k">def</span> <span class="nf">hasNode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
+    <span class="k">return</span> <span class="n">node</span> <span class="ow">in</span> <span class="bp">self</span>
+
+  <span class="k">def</span> <span class="nf">hasPath</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
+    <span class="k">return</span> <span class="n">node</span> <span class="ow">in</span> <span class="bp">self</span> <span class="ow">and</span> <span class="n">path</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">[</span><span class="n">node</span><span class="p">]</span>
+
+  <span class="k">def</span> <span class="nf">hasIntf</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">intf</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
+    <span class="k">return</span> <span class="n">node</span> <span class="ow">in</span> <span class="bp">self</span> <span class="ow">and</span> <span class="n">path</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">[</span><span class="n">node</span><span class="p">]</span> <span class="ow">and</span> <span class="n">intf</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">[</span><span class="n">node</span><span class="p">][</span><span class="n">path</span><span class="p">]</span>
+
+  <span class="k">def</span> <span class="nf">addNode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s1">&#39;DNodes&#39;</span><span class="p">:</span>
+    <span class="k">if</span> <span class="n">node</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;node {} already exists&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+    <span class="n">nodes</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">(),</span> <span class="p">[</span><span class="n">DNode</span><span class="p">(</span><span class="n">node</span><span class="p">)])</span>
+    <span class="k">return</span> <span class="n">DNodes</span><span class="p">(</span><span class="n">nodes</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">delNode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s1">&#39;DNodes&#39;</span><span class="p">:</span>
+    <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;node {} does not exist&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+    <span class="k">if</span> <span class="bp">self</span><span class="p">[</span><span class="n">node</span><span class="p">]:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;node {} is not empty&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+    <span class="n">nodes</span> <span class="o">=</span> <span class="p">(</span><span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="n">node</span><span class="p">)</span>
+    <span class="k">return</span> <span class="n">DNodes</span><span class="p">(</span><span class="n">nodes</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">addPath</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s1">&#39;DNodes&#39;</span><span class="p">:</span>
+    <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;node {} does not exist&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+    <span class="n">nodes</span> <span class="o">=</span> <span class="p">(</span><span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="n">node</span><span class="p">)</span>
+    <span class="n">nodes</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="n">nodes</span><span class="p">,</span> <span class="p">[</span><span class="bp">self</span><span class="p">[</span><span class="n">node</span><span class="p">]</span><span class="o">.</span><span class="n">addPath</span><span class="p">(</span><span class="n">path</span><span class="p">)])</span>
+    <span class="k">return</span> <span class="n">DNodes</span><span class="p">(</span><span class="n">nodes</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">delPath</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s1">&#39;DNodes&#39;</span><span class="p">:</span>
+    <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;node {} does not exist&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+    <span class="n">nodes</span> <span class="o">=</span> <span class="p">(</span><span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="n">node</span><span class="p">)</span>
+    <span class="n">nodes</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="n">nodes</span><span class="p">,</span> <span class="p">[</span><span class="bp">self</span><span class="p">[</span><span class="n">node</span><span class="p">]</span><span class="o">.</span><span class="n">delPath</span><span class="p">(</span><span class="n">path</span><span class="p">)])</span>
+    <span class="k">return</span> <span class="n">DNodes</span><span class="p">(</span><span class="n">nodes</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">addInterface</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">interface</span><span class="p">:</span> <span class="n">DInterface</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s1">&#39;DNodes&#39;</span><span class="p">:</span>
+    <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;node {} does not exist&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+    <span class="n">nodes</span> <span class="o">=</span> <span class="p">(</span><span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="n">node</span><span class="p">)</span>
+    <span class="n">nodes</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="n">nodes</span><span class="p">,</span> <span class="p">[</span><span class="bp">self</span><span class="p">[</span><span class="n">node</span><span class="p">]</span><span class="o">.</span><span class="n">addInterface</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">interface</span><span class="p">)])</span>
+    <span class="k">return</span> <span class="n">DNodes</span><span class="p">(</span><span class="n">nodes</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">delInterface</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">interface</span><span class="p">:</span> <span class="n">DInterface</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s1">&#39;DNodes&#39;</span><span class="p">:</span>
+    <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;node {} does not exist&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+    <span class="n">nodes</span> <span class="o">=</span> <span class="p">(</span><span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="n">node</span><span class="p">)</span>
+    <span class="n">nodes</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="n">nodes</span><span class="p">,</span> <span class="p">[</span><span class="bp">self</span><span class="p">[</span><span class="n">node</span><span class="p">]</span><span class="o">.</span><span class="n">delInterface</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">interface</span><span class="p">)])</span>
+    <span class="k">return</span> <span class="n">DNodes</span><span class="p">(</span><span class="n">nodes</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+
+      <div class="class">
+          <h3>Ancestors (in MRO)</h3>
+          <ul class="class_list">
+          <li><a href="/screwerk/supcon/intf.m.md#supcon.intf.DNodes">DNodes</a></li>
+          <li>supcon.util.NamedList</li>
+          <li>collections.abc.Mapping</li>
+          <li>collections.abc.Collection</li>
+          <li>collections.abc.Sized</li>
+          <li>collections.abc.Iterable</li>
+          <li>collections.abc.Container</li>
+          <li>supcon.util.Dumpable</li>
+          <li>abc.ABC</li>
+          <li>builtins.object</li>
+          </ul>
+          <h3>Class variables</h3>
+            <div class="item">
+            <p id="supcon.intf.DNodes.vtype" class="name">var <span class="ident">vtype</span></p>
+            
+
+            
+  
+  <div class="source_cont">
+</div>
+
+            </div>
+          <h3>Class Methods</h3>
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DNodes.load">
+    <p>def <span class="ident">load</span>(</p><p>cls, data)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Converts the given list of 'simple' datastructures <strong>data</strong> into an instance
+of <strong>cls</strong>, a subclass of <code>supcon.util.NamedList</code>.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNodes.load', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DNodes.load" class="source">
+    <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">  Converts the given list of &#39;simple&#39; datastructures **data** into an instance</span>
+<span class="sd">  of **cls**, a subclass of `supcon.util.NamedList`.</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DNodes.to">
+    <p>def <span class="ident">to</span>(</p><p>cls, value)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>If the the <strong>value</strong> is an instance of <strong>cls</strong>, a subclass of
+<code>supcon.util.NamedList</code>, the value is returned. If value is not an instance
+of <strong>cls</strong> the method tries to convert the <strong>value</strong> into an instance of
+<strong>cls</strong>.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNodes.to', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DNodes.to" class="source">
+    <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">to</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">  If the the **value** is an instance of **cls**, a subclass of</span>
+<span class="sd">  `supcon.util.NamedList`, the value is returned. If value is not an instance</span>
+<span class="sd">  of **cls** the method tries to convert the **value** into an instance of</span>
+<span class="sd">  **cls**.</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">return</span> <span class="n">value</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">cls</span><span class="p">)</span> <span class="k">else</span> <span class="bp">cls</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+          <h3>Methods</h3>
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DNodes.__init__">
+    <p>def <span class="ident">__init__</span>(</p><p>self, values=None)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Initializes the <code>supcon.util.NamedList</code> with the given list of <strong>values</strong>.</p>
+<p>An element of <strong>values</strong> must be of type <code>supcon.util.NamedList.vtype</code> or a
+'simple' datastructure that can be converted to an instance of
+<code>supcon.util.NamedList.vtype</code> by <code>supcon.util.NamedList.vtype</code>.load().</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNodes.__init__', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DNodes.__init__" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">values</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">  Initializes the `supcon.util.NamedList` with the given list of **values**.</span>
+<span class="sd">  An element of **values** must be of type `supcon.util.NamedList.vtype` or a</span>
+<span class="sd">  &#39;simple&#39; datastructure that can be converted to an instance of</span>
+<span class="sd">  `supcon.util.NamedList.vtype` by `supcon.util.NamedList.vtype`.load().</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">if</span> <span class="n">values</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+    <span class="n">values</span> <span class="o">=</span> <span class="p">[]</span>
+  <span class="k">if</span> <span class="ow">not</span> <span class="nb">issubclass</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="p">,</span> <span class="n">Named</span><span class="p">):</span>
+    <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;the value type must be a subclass of Named&#39;</span><span class="p">)</span>
+  <span class="k">if</span> <span class="ow">not</span> <span class="nb">issubclass</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="p">,</span> <span class="n">Dumpable</span><span class="p">):</span>
+    <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;the value type must be a subclass of Dumpable&#39;</span><span class="p">)</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__values</span> <span class="o">=</span> <span class="n">collections</span><span class="o">.</span><span class="n">OrderedDict</span><span class="p">()</span>
+  <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">values</span><span class="p">:</span>
+    <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="p">):</span>
+      <span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+    <span class="k">if</span> <span class="n">value</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__values</span><span class="p">:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;value.name must be unique in the given list of values&#39;</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__values</span><span class="p">[</span><span class="n">value</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DNodes.addInterface">
+    <p>def <span class="ident">addInterface</span>(</p><p>self, node, path, interface)</p>
+    </div>
+    
+
+    
+  
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNodes.addInterface', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DNodes.addInterface" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">addInterface</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">interface</span><span class="p">:</span> <span class="n">DInterface</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s1">&#39;DNodes&#39;</span><span class="p">:</span>
+  <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+    <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;node {} does not exist&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+  <span class="n">nodes</span> <span class="o">=</span> <span class="p">(</span><span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="n">node</span><span class="p">)</span>
+  <span class="n">nodes</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="n">nodes</span><span class="p">,</span> <span class="p">[</span><span class="bp">self</span><span class="p">[</span><span class="n">node</span><span class="p">]</span><span class="o">.</span><span class="n">addInterface</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">interface</span><span class="p">)])</span>
+  <span class="k">return</span> <span class="n">DNodes</span><span class="p">(</span><span class="n">nodes</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DNodes.addNode">
+    <p>def <span class="ident">addNode</span>(</p><p>self, node)</p>
+    </div>
+    
+
+    
+  
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNodes.addNode', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DNodes.addNode" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">addNode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s1">&#39;DNodes&#39;</span><span class="p">:</span>
+  <span class="k">if</span> <span class="n">node</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+    <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;node {} already exists&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+  <span class="n">nodes</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">(),</span> <span class="p">[</span><span class="n">DNode</span><span class="p">(</span><span class="n">node</span><span class="p">)])</span>
+  <span class="k">return</span> <span class="n">DNodes</span><span class="p">(</span><span class="n">nodes</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DNodes.addPath">
+    <p>def <span class="ident">addPath</span>(</p><p>self, node, path)</p>
+    </div>
+    
+
+    
+  
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNodes.addPath', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DNodes.addPath" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">addPath</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s1">&#39;DNodes&#39;</span><span class="p">:</span>
+  <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+    <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;node {} does not exist&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+  <span class="n">nodes</span> <span class="o">=</span> <span class="p">(</span><span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="n">node</span><span class="p">)</span>
+  <span class="n">nodes</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="n">nodes</span><span class="p">,</span> <span class="p">[</span><span class="bp">self</span><span class="p">[</span><span class="n">node</span><span class="p">]</span><span class="o">.</span><span class="n">addPath</span><span class="p">(</span><span class="n">path</span><span class="p">)])</span>
+  <span class="k">return</span> <span class="n">DNodes</span><span class="p">(</span><span class="n">nodes</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DNodes.delInterface">
+    <p>def <span class="ident">delInterface</span>(</p><p>self, node, path, interface)</p>
+    </div>
+    
+
+    
+  
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNodes.delInterface', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DNodes.delInterface" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">delInterface</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">interface</span><span class="p">:</span> <span class="n">DInterface</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s1">&#39;DNodes&#39;</span><span class="p">:</span>
+  <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+    <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;node {} does not exist&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+  <span class="n">nodes</span> <span class="o">=</span> <span class="p">(</span><span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="n">node</span><span class="p">)</span>
+  <span class="n">nodes</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="n">nodes</span><span class="p">,</span> <span class="p">[</span><span class="bp">self</span><span class="p">[</span><span class="n">node</span><span class="p">]</span><span class="o">.</span><span class="n">delInterface</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">interface</span><span class="p">)])</span>
+  <span class="k">return</span> <span class="n">DNodes</span><span class="p">(</span><span class="n">nodes</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DNodes.delNode">
+    <p>def <span class="ident">delNode</span>(</p><p>self, node)</p>
+    </div>
+    
+
+    
+  
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNodes.delNode', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DNodes.delNode" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">delNode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s1">&#39;DNodes&#39;</span><span class="p">:</span>
+  <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+    <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;node {} does not exist&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+  <span class="k">if</span> <span class="bp">self</span><span class="p">[</span><span class="n">node</span><span class="p">]:</span>
+    <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;node {} is not empty&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+  <span class="n">nodes</span> <span class="o">=</span> <span class="p">(</span><span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="n">node</span><span class="p">)</span>
+  <span class="k">return</span> <span class="n">DNodes</span><span class="p">(</span><span class="n">nodes</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DNodes.delPath">
+    <p>def <span class="ident">delPath</span>(</p><p>self, node, path)</p>
+    </div>
+    
+
+    
+  
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNodes.delPath', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DNodes.delPath" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">delPath</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s1">&#39;DNodes&#39;</span><span class="p">:</span>
+  <span class="k">if</span> <span class="n">node</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+    <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;node {} does not exist&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
+  <span class="n">nodes</span> <span class="o">=</span> <span class="p">(</span><span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="n">node</span><span class="p">)</span>
+  <span class="n">nodes</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="n">nodes</span><span class="p">,</span> <span class="p">[</span><span class="bp">self</span><span class="p">[</span><span class="n">node</span><span class="p">]</span><span class="o">.</span><span class="n">delPath</span><span class="p">(</span><span class="n">path</span><span class="p">)])</span>
+  <span class="k">return</span> <span class="n">DNodes</span><span class="p">(</span><span class="n">nodes</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DNodes.dump">
+    <p>def <span class="ident">dump</span>(</p><p>self)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Converts the <code>supcon.util.NamedList</code> into a list of 'simple' datastructures.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNodes.dump', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DNodes.dump" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">  Converts the `supcon.util.NamedList` into a list of &#39;simple&#39; datastructures.</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">return</span> <span class="p">[</span><span class="n">value</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span> <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()]</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DNodes.get">
+    <p>def <span class="ident">get</span>(</p><p>self, key, default=None)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>D.get(k[,d]) -&gt; D[k] if k in D, else d.  d defaults to None.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNodes.get', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DNodes.get" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">get</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+    <span class="s1">&#39;D.get(k[,d]) -&gt; D[k] if k in D, else d.  d defaults to None.&#39;</span>
+    <span class="k">try</span><span class="p">:</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
+    <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
+        <span class="k">return</span> <span class="n">default</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DNodes.hasIntf">
+    <p>def <span class="ident">hasIntf</span>(</p><p>self, node, path, intf)</p>
+    </div>
+    
+
+    
+  
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNodes.hasIntf', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DNodes.hasIntf" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">hasIntf</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">intf</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
+  <span class="k">return</span> <span class="n">node</span> <span class="ow">in</span> <span class="bp">self</span> <span class="ow">and</span> <span class="n">path</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">[</span><span class="n">node</span><span class="p">]</span> <span class="ow">and</span> <span class="n">intf</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">[</span><span class="n">node</span><span class="p">][</span><span class="n">path</span><span class="p">]</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DNodes.hasNode">
+    <p>def <span class="ident">hasNode</span>(</p><p>self, node)</p>
+    </div>
+    
+
+    
+  
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNodes.hasNode', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DNodes.hasNode" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">hasNode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
+  <span class="k">return</span> <span class="n">node</span> <span class="ow">in</span> <span class="bp">self</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DNodes.hasPath">
+    <p>def <span class="ident">hasPath</span>(</p><p>self, node, path)</p>
+    </div>
+    
+
+    
+  
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNodes.hasPath', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DNodes.hasPath" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">hasPath</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
+  <span class="k">return</span> <span class="n">node</span> <span class="ow">in</span> <span class="bp">self</span> <span class="ow">and</span> <span class="n">path</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">[</span><span class="n">node</span><span class="p">]</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DNodes.items">
+    <p>def <span class="ident">items</span>(</p><p>self)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>D.items() -&gt; a set-like object providing a view on D's items</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNodes.items', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DNodes.items" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">items</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="s2">&quot;D.items() -&gt; a set-like object providing a view on D&#39;s items&quot;</span>
+    <span class="k">return</span> <span class="n">ItemsView</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DNodes.keys">
+    <p>def <span class="ident">keys</span>(</p><p>self)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>D.keys() -&gt; a set-like object providing a view on D's keys</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNodes.keys', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DNodes.keys" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">keys</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="s2">&quot;D.keys() -&gt; a set-like object providing a view on D&#39;s keys&quot;</span>
+    <span class="k">return</span> <span class="n">KeysView</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DNodes.values">
+    <p>def <span class="ident">values</span>(</p><p>self)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>D.values() -&gt; an object providing a view on D's values</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DNodes.values', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DNodes.values" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">values</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="s2">&quot;D.values() -&gt; an object providing a view on D&#39;s values&quot;</span>
+    <span class="k">return</span> <span class="n">ValuesView</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+      </div>
+      </div>
+      
+      <div class="item">
+      <p id="supcon.intf.DPath" class="name">class <span class="ident">DPath</span></p>
+      
+  
+    <div class="desc"><p>A named readonly map of <a href="/screwerk/supcon/intf.m.md#supcon.intf.DInterface"><code>DInterface</code></a> instances</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DPath', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DPath" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">DPath</span><span class="p">(</span><span class="n">Named</span><span class="p">,</span> <span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">NamedList</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;A named readonly map of `supcon.intf.DInterface` instances&quot;&quot;&quot;</span>
+
+  <span class="n">vtype</span> <span class="o">=</span> <span class="n">DInterface</span>
+  <span class="n">regex</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s1">&#39;/(([a-zA-Z0-9_]+/)*[a-zA-Z0-9_]+)?&#39;</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">interfaces</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Initializes the Path instance</span>
+
+<span class="sd">    Args:</span>
+<span class="sd">      name (str): the name of the argument</span>
+<span class="sd">      interfaces (): ...</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">if</span> <span class="n">interfaces</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+      <span class="n">interfaces</span> <span class="o">=</span> <span class="p">[]</span>
+    <span class="n">Named</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
+    <span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">NamedList</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">interfaces</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="k">return</span> <span class="p">{</span>
+      <span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
+      <span class="s1">&#39;interfaces&#39;</span><span class="p">:</span> <span class="p">[</span><span class="n">value</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span> <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()]</span>
+    <span class="p">}</span>
+
+  <span class="nd">@classmethod</span>
+  <span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s1">&#39;DPath&#39;</span><span class="p">:</span>
+    <span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="o">**</span><span class="n">data</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">addInterface</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">interface</span><span class="p">:</span> <span class="n">DInterface</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s1">&#39;DPath&#39;</span><span class="p">:</span>
+    <span class="k">if</span> <span class="n">interface</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;interface {} at path {} already exists&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">interface</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+    <span class="n">interfaces</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">(),</span> <span class="p">[</span><span class="n">interface</span><span class="p">])</span>
+    <span class="k">return</span> <span class="n">DPath</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">interfaces</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">delInterface</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">interface</span><span class="p">:</span> <span class="n">DInterface</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s1">&#39;DPath&#39;</span><span class="p">:</span>
+    <span class="k">if</span> <span class="n">interface</span><span class="o">.</span><span class="n">name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;interface {} at path {} does not exist&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">interface</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+    <span class="n">interfaces</span> <span class="o">=</span> <span class="p">(</span><span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="n">interface</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+    <span class="k">return</span> <span class="n">DPath</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">interfaces</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+
+      <div class="class">
+          <h3>Ancestors (in MRO)</h3>
+          <ul class="class_list">
+          <li><a href="/screwerk/supcon/intf.m.md#supcon.intf.DPath">DPath</a></li>
+          <li><a href="/screwerk/supcon/intf.m.md#supcon.intf.Named">Named</a></li>
+          <li>supcon.util.Named</li>
+          <li>supcon.util.NamedList</li>
+          <li>collections.abc.Mapping</li>
+          <li>collections.abc.Collection</li>
+          <li>collections.abc.Sized</li>
+          <li>collections.abc.Iterable</li>
+          <li>collections.abc.Container</li>
+          <li>supcon.util.Dumpable</li>
+          <li>abc.ABC</li>
+          <li>builtins.object</li>
+          </ul>
+          <h3>Class variables</h3>
+            <div class="item">
+            <p id="supcon.intf.DPath.regex" class="name">var <span class="ident">regex</span></p>
+            
+
+            
+  
+  <div class="source_cont">
+</div>
+
+            </div>
+            <div class="item">
+            <p id="supcon.intf.DPath.vtype" class="name">var <span class="ident">vtype</span></p>
+            
+
+            
+  
+  <div class="source_cont">
+</div>
+
+            </div>
+          <h3>Class Methods</h3>
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DPath.load">
+    <p>def <span class="ident">load</span>(</p><p>cls, data)</p>
+    </div>
+    
+
+    
+  
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DPath.load', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DPath.load" class="source">
+    <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s1">&#39;DPath&#39;</span><span class="p">:</span>
+  <span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="o">**</span><span class="n">data</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DPath.to">
+    <p>def <span class="ident">to</span>(</p><p>cls, value)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>If the the <strong>value</strong> is an instance of <strong>cls</strong>, a subclass of
+<code>supcon.util.NamedList</code>, the value is returned. If value is not an instance
+of <strong>cls</strong> the method tries to convert the <strong>value</strong> into an instance of
+<strong>cls</strong>.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DPath.to', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DPath.to" class="source">
+    <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">to</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">  If the the **value** is an instance of **cls**, a subclass of</span>
+<span class="sd">  `supcon.util.NamedList`, the value is returned. If value is not an instance</span>
+<span class="sd">  of **cls** the method tries to convert the **value** into an instance of</span>
+<span class="sd">  **cls**.</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">return</span> <span class="n">value</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">cls</span><span class="p">)</span> <span class="k">else</span> <span class="bp">cls</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DPath.toName">
+    <p>def <span class="ident">toName</span>(</p><p>cls, value)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Converts the value into a name. If this is impossible a ValueError is
+raised.</p>
+<p>Args:
+  value (any): the value
+Raises:
+  ValueError</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DPath.toName', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DPath.toName" class="source">
+    <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">toName</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
+  <span class="sd">&quot;&quot;&quot;Converts the value into a name. If this is impossible a ValueError is</span>
+<span class="sd">  raised.</span>
+<span class="sd">  Args:</span>
+<span class="sd">    value (any): the value</span>
+<span class="sd">  Raises:</span>
+<span class="sd">    ValueError</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="n">value</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+  <span class="k">if</span> <span class="ow">not</span> <span class="bp">cls</span><span class="o">.</span><span class="n">regex</span><span class="o">.</span><span class="n">fullmatch</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
+    <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;value {} must match {} fully&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">cls</span><span class="o">.</span><span class="n">regex</span><span class="o">.</span><span class="n">pattern</span><span class="p">))</span>
+  <span class="k">return</span> <span class="n">value</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+          <h3>Instance variables</h3>
+            <div class="item">
+            <p id="supcon.intf.DPath.name" class="name">var <span class="ident">name</span></p>
+            
+    <p class="inheritance">
+     <strong>Inheritance:</strong>
+       <code><a href="/screwerk/supcon/intf.m.md#supcon.intf.Named">Named</a></code>.<code><a href="/screwerk/supcon/intf.m.md#supcon.intf.Named.name">name</a></code>
+    </p>
+
+            
+  
+    <div class="desc inherited"><p>str: the name</p></div>
+  <div class="source_cont">
+</div>
+
+            </div>
+          <h3>Methods</h3>
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DPath.__init__">
+    <p>def <span class="ident">__init__</span>(</p><p>self, name, interfaces=None)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Initializes the Path instance</p>
+<p>Args:
+  name (str): the name of the argument
+  interfaces (): ...</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DPath.__init__', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DPath.__init__" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">interfaces</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;Initializes the Path instance</span>
+<span class="sd">  Args:</span>
+<span class="sd">    name (str): the name of the argument</span>
+<span class="sd">    interfaces (): ...</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">if</span> <span class="n">interfaces</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+    <span class="n">interfaces</span> <span class="o">=</span> <span class="p">[]</span>
+  <span class="n">Named</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
+  <span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">NamedList</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">interfaces</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DPath.addInterface">
+    <p>def <span class="ident">addInterface</span>(</p><p>self, interface)</p>
+    </div>
+    
+
+    
+  
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DPath.addInterface', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DPath.addInterface" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">addInterface</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">interface</span><span class="p">:</span> <span class="n">DInterface</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s1">&#39;DPath&#39;</span><span class="p">:</span>
+  <span class="k">if</span> <span class="n">interface</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+    <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;interface {} at path {} already exists&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">interface</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+  <span class="n">interfaces</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">(),</span> <span class="p">[</span><span class="n">interface</span><span class="p">])</span>
+  <span class="k">return</span> <span class="n">DPath</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">interfaces</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DPath.delInterface">
+    <p>def <span class="ident">delInterface</span>(</p><p>self, interface)</p>
+    </div>
+    
+
+    
+  
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DPath.delInterface', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DPath.delInterface" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">delInterface</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">interface</span><span class="p">:</span> <span class="n">DInterface</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s1">&#39;DPath&#39;</span><span class="p">:</span>
+  <span class="k">if</span> <span class="n">interface</span><span class="o">.</span><span class="n">name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+    <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;interface {} at path {} does not exist&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">interface</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+  <span class="n">interfaces</span> <span class="o">=</span> <span class="p">(</span><span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="n">interface</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+  <span class="k">return</span> <span class="n">DPath</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">interfaces</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DPath.dump">
+    <p>def <span class="ident">dump</span>(</p><p>self)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Converts the <code>supcon.util.NamedList</code> into a list of 'simple' datastructures.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DPath.dump', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DPath.dump" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+  <span class="k">return</span> <span class="p">{</span>
+    <span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
+    <span class="s1">&#39;interfaces&#39;</span><span class="p">:</span> <span class="p">[</span><span class="n">value</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span> <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()]</span>
+  <span class="p">}</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DPath.get">
+    <p>def <span class="ident">get</span>(</p><p>self, key, default=None)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>D.get(k[,d]) -&gt; D[k] if k in D, else d.  d defaults to None.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DPath.get', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DPath.get" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">get</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+    <span class="s1">&#39;D.get(k[,d]) -&gt; D[k] if k in D, else d.  d defaults to None.&#39;</span>
+    <span class="k">try</span><span class="p">:</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
+    <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
+        <span class="k">return</span> <span class="n">default</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DPath.items">
+    <p>def <span class="ident">items</span>(</p><p>self)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>D.items() -&gt; a set-like object providing a view on D's items</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DPath.items', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DPath.items" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">items</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="s2">&quot;D.items() -&gt; a set-like object providing a view on D&#39;s items&quot;</span>
+    <span class="k">return</span> <span class="n">ItemsView</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DPath.keys">
+    <p>def <span class="ident">keys</span>(</p><p>self)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>D.keys() -&gt; a set-like object providing a view on D's keys</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DPath.keys', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DPath.keys" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">keys</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="s2">&quot;D.keys() -&gt; a set-like object providing a view on D&#39;s keys&quot;</span>
+    <span class="k">return</span> <span class="n">KeysView</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.DPath.values">
+    <p>def <span class="ident">values</span>(</p><p>self)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>D.values() -&gt; an object providing a view on D's values</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.DPath.values', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.DPath.values" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">values</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="s2">&quot;D.values() -&gt; an object providing a view on D&#39;s values&quot;</span>
+    <span class="k">return</span> <span class="n">ValuesView</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+      </div>
+      </div>
+      
+      <div class="item">
+      <p id="supcon.intf.Implementation" class="name">class <span class="ident">Implementation</span></p>
+      
+  
+    <div class="desc"><p>The base class for interface implementations</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.Implementation', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.Implementation" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">Implementation</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;The base class for interface implementations&quot;&quot;&quot;</span>
+
+  <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">interface</span><span class="p">:</span> <span class="n">DInterface</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    Args:</span>
+<span class="sd">      interface (DInterface): the interface that is implemented by this Implementation</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">interface</span><span class="p">,</span> <span class="n">DInterface</span><span class="p">):</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;interface must be an instance of {}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">DInterface</span><span class="p">))</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__interface</span> <span class="o">=</span> <span class="n">interface</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__callCbs</span> <span class="o">=</span> <span class="p">{}</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__fireCbs</span> <span class="o">=</span> <span class="p">[]</span>
+
+  <span class="nd">@property</span>
+  <span class="k">def</span> <span class="nf">intf</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
+    <span class="sd">&quot;&quot;&quot;str: The name of the implemented interface&quot;&quot;&quot;</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__interface</span><span class="o">.</span><span class="n">name</span>
+
+  <span class="nd">@property</span>
+  <span class="k">def</span> <span class="nf">interface</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">DInterface</span><span class="p">:</span>
+    <span class="sd">&quot;&quot;&quot;Interface: The implemented interface&quot;&quot;&quot;</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__interface</span>
+
+  <span class="k">def</span> <span class="nf">setCallCb</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">method</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">cb</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Sets a callback for the given method. The method must be a method of the</span>
+<span class="sd">    interface this Implementation implements. The callback must implement the</span>
+<span class="sd">    given method. The callback gets called by calls to Implementation.call()</span>
+
+<span class="sd">    Args:</span>
+<span class="sd">      method (str): the interface method that the callback implements</span>
+<span class="sd">      cb (callable): the callback</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="n">method</span> <span class="o">=</span> <span class="n">DMethod</span><span class="o">.</span><span class="n">toName</span><span class="p">(</span><span class="n">method</span><span class="p">)</span>
+    <span class="k">if</span> <span class="n">method</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callCbs</span><span class="p">:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;Callback for method {} is already set!&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">))</span>
+    <span class="k">if</span> <span class="n">method</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__interface</span><span class="o">.</span><span class="n">methods</span><span class="p">:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;Interface has no method {}!&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">))</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__callCbs</span><span class="p">[</span><span class="n">method</span><span class="p">]</span> <span class="o">=</span> <span class="n">cb</span>
+
+  <span class="k">def</span> <span class="nf">call</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">method</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">inArgs</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+    <span class="sd">&quot;&quot;&quot;Calls the given interface method with the given arguments. This method</span>
+<span class="sd">    calls the callback set by Implementation.setCallCb()</span>
+
+<span class="sd">    Args:</span>
+<span class="sd">      method (str): the called interface method</span>
+<span class="sd">      inArgs (Mapping): a map of input arguments</span>
+<span class="sd">    Returns:</span>
+<span class="sd">      defer.Deferred: Resolves with the result of the called method</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">def</span> <span class="nf">validateReturn</span><span class="p">(</span><span class="n">outArgs</span><span class="p">):</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__interface</span><span class="o">.</span><span class="n">validateReturn</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">outArgs</span><span class="p">)</span>
+      <span class="k">return</span> <span class="n">outArgs</span>
+
+    <span class="k">try</span><span class="p">:</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__interface</span><span class="o">.</span><span class="n">validateCall</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">inArgs</span><span class="p">)</span>
+      <span class="k">if</span> <span class="n">method</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callCbs</span><span class="p">:</span>
+        <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;Callback for method {} is not set!&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">))</span>
+
+      <span class="n">d</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callCbs</span><span class="p">[</span><span class="n">method</span><span class="p">](</span><span class="o">**</span><span class="n">inArgs</span><span class="p">)</span>
+      <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">d</span><span class="p">,</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">):</span>
+        <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">succeed</span><span class="p">(</span><span class="n">d</span><span class="p">)</span>
+      <span class="n">d</span><span class="o">.</span><span class="n">addCallback</span><span class="p">(</span><span class="n">validateReturn</span><span class="p">)</span>
+    <span class="k">except</span> <span class="ne">BaseException</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
+      <span class="n">traceback</span><span class="o">.</span><span class="n">print_exc</span><span class="p">()</span>
+      <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">fail</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
+
+    <span class="k">return</span> <span class="n">d</span>
+
+  <span class="k">def</span> <span class="nf">addFireCb</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cb</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Adds a callback that gets called, when this Implementation fires an</span>
+<span class="sd">    event.</span>
+
+<span class="sd">    Args:</span>
+<span class="sd">      cb (callable): the callback</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__fireCbs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">cb</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">delFireCb</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cb</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Removes a callback that gets called, when this Implementation fires an</span>
+<span class="sd">    event.</span>
+
+<span class="sd">    Args:</span>
+<span class="sd">      cb (callable): the callback</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__fireCbs</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">cb</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">fire</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">args</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Fires the given event with the given arguments.</span>
+
+<span class="sd">    Args:</span>
+<span class="sd">      event (str): the event name</span>
+<span class="sd">      args (collecion.Mapping): the event arguments</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__interface</span><span class="o">.</span><span class="n">validateEvent</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+
+    <span class="k">for</span> <span class="n">cb</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__fireCbs</span><span class="p">:</span>
+      <span class="n">cb</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+
+      <div class="class">
+          <h3>Ancestors (in MRO)</h3>
+          <ul class="class_list">
+          <li><a href="/screwerk/supcon/intf.m.md#supcon.intf.Implementation">Implementation</a></li>
+          <li>builtins.object</li>
+          </ul>
+          <h3>Instance variables</h3>
+            <div class="item">
+            <p id="supcon.intf.Implementation.interface" class="name">var <span class="ident">interface</span></p>
+            
+
+            
+  
+    <div class="desc"><p>Interface: The implemented interface</p></div>
+  <div class="source_cont">
+</div>
+
+            </div>
+            <div class="item">
+            <p id="supcon.intf.Implementation.intf" class="name">var <span class="ident">intf</span></p>
+            
+
+            
+  
+    <div class="desc"><p>str: The name of the implemented interface</p></div>
+  <div class="source_cont">
+</div>
+
+            </div>
+          <h3>Methods</h3>
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.Implementation.__init__">
+    <p>def <span class="ident">__init__</span>(</p><p>self, interface)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Args:
+interface (DInterface): the interface that is implemented by this Implementation</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.Implementation.__init__', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.Implementation.__init__" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">interface</span><span class="p">:</span> <span class="n">DInterface</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">  Args:</span>
+<span class="sd">    interface (DInterface): the interface that is implemented by this Implementation</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">interface</span><span class="p">,</span> <span class="n">DInterface</span><span class="p">):</span>
+    <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;interface must be an instance of {}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">DInterface</span><span class="p">))</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__interface</span> <span class="o">=</span> <span class="n">interface</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__callCbs</span> <span class="o">=</span> <span class="p">{}</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__fireCbs</span> <span class="o">=</span> <span class="p">[]</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.Implementation.addFireCb">
+    <p>def <span class="ident">addFireCb</span>(</p><p>self, cb)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Adds a callback that gets called, when this Implementation fires an
+event.</p>
+<p>Args:
+  cb (callable): the callback</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.Implementation.addFireCb', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.Implementation.addFireCb" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">addFireCb</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cb</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;Adds a callback that gets called, when this Implementation fires an</span>
+<span class="sd">  event.</span>
+<span class="sd">  Args:</span>
+<span class="sd">    cb (callable): the callback</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__fireCbs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">cb</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.Implementation.call">
+    <p>def <span class="ident">call</span>(</p><p>self, method, inArgs)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Calls the given interface method with the given arguments. This method
+calls the callback set by Implementation.setCallCb()</p>
+<p>Args:
+  method (str): the called interface method
+  inArgs (Mapping): a map of input arguments
+Returns:
+  defer.Deferred: Resolves with the result of the called method</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.Implementation.call', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.Implementation.call" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">call</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">method</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">inArgs</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+  <span class="sd">&quot;&quot;&quot;Calls the given interface method with the given arguments. This method</span>
+<span class="sd">  calls the callback set by Implementation.setCallCb()</span>
+<span class="sd">  Args:</span>
+<span class="sd">    method (str): the called interface method</span>
+<span class="sd">    inArgs (Mapping): a map of input arguments</span>
+<span class="sd">  Returns:</span>
+<span class="sd">    defer.Deferred: Resolves with the result of the called method</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">def</span> <span class="nf">validateReturn</span><span class="p">(</span><span class="n">outArgs</span><span class="p">):</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__interface</span><span class="o">.</span><span class="n">validateReturn</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">outArgs</span><span class="p">)</span>
+    <span class="k">return</span> <span class="n">outArgs</span>
+  <span class="k">try</span><span class="p">:</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__interface</span><span class="o">.</span><span class="n">validateCall</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">inArgs</span><span class="p">)</span>
+    <span class="k">if</span> <span class="n">method</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callCbs</span><span class="p">:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;Callback for method {} is not set!&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">))</span>
+    <span class="n">d</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callCbs</span><span class="p">[</span><span class="n">method</span><span class="p">](</span><span class="o">**</span><span class="n">inArgs</span><span class="p">)</span>
+    <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">d</span><span class="p">,</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">):</span>
+      <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">succeed</span><span class="p">(</span><span class="n">d</span><span class="p">)</span>
+    <span class="n">d</span><span class="o">.</span><span class="n">addCallback</span><span class="p">(</span><span class="n">validateReturn</span><span class="p">)</span>
+  <span class="k">except</span> <span class="ne">BaseException</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
+    <span class="n">traceback</span><span class="o">.</span><span class="n">print_exc</span><span class="p">()</span>
+    <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">fail</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
+  <span class="k">return</span> <span class="n">d</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.Implementation.delFireCb">
+    <p>def <span class="ident">delFireCb</span>(</p><p>self, cb)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Removes a callback that gets called, when this Implementation fires an
+event.</p>
+<p>Args:
+  cb (callable): the callback</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.Implementation.delFireCb', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.Implementation.delFireCb" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">delFireCb</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cb</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;Removes a callback that gets called, when this Implementation fires an</span>
+<span class="sd">  event.</span>
+<span class="sd">  Args:</span>
+<span class="sd">    cb (callable): the callback</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__fireCbs</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">cb</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.Implementation.fire">
+    <p>def <span class="ident">fire</span>(</p><p>self, event, args)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Fires the given event with the given arguments.</p>
+<p>Args:
+  event (str): the event name
+  args (collecion.Mapping): the event arguments</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.Implementation.fire', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.Implementation.fire" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">fire</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">args</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;Fires the given event with the given arguments.</span>
+<span class="sd">  Args:</span>
+<span class="sd">    event (str): the event name</span>
+<span class="sd">    args (collecion.Mapping): the event arguments</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__interface</span><span class="o">.</span><span class="n">validateEvent</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+  <span class="k">for</span> <span class="n">cb</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__fireCbs</span><span class="p">:</span>
+    <span class="n">cb</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.Implementation.setCallCb">
+    <p>def <span class="ident">setCallCb</span>(</p><p>self, method, cb)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Sets a callback for the given method. The method must be a method of the
+interface this Implementation implements. The callback must implement the
+given method. The callback gets called by calls to Implementation.call()</p>
+<p>Args:
+  method (str): the interface method that the callback implements
+  cb (callable): the callback</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.Implementation.setCallCb', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.Implementation.setCallCb" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">setCallCb</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">method</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">cb</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;Sets a callback for the given method. The method must be a method of the</span>
+<span class="sd">  interface this Implementation implements. The callback must implement the</span>
+<span class="sd">  given method. The callback gets called by calls to Implementation.call()</span>
+<span class="sd">  Args:</span>
+<span class="sd">    method (str): the interface method that the callback implements</span>
+<span class="sd">    cb (callable): the callback</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="n">method</span> <span class="o">=</span> <span class="n">DMethod</span><span class="o">.</span><span class="n">toName</span><span class="p">(</span><span class="n">method</span><span class="p">)</span>
+  <span class="k">if</span> <span class="n">method</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callCbs</span><span class="p">:</span>
+    <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;Callback for method {} is already set!&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">))</span>
+  <span class="k">if</span> <span class="n">method</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__interface</span><span class="o">.</span><span class="n">methods</span><span class="p">:</span>
+    <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;Interface has no method {}!&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">method</span><span class="p">))</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__callCbs</span><span class="p">[</span><span class="n">method</span><span class="p">]</span> <span class="o">=</span> <span class="n">cb</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+      </div>
+      </div>
+      
+      <div class="item">
+      <p id="supcon.intf.Named" class="name">class <span class="ident">Named</span></p>
+      
+  
+    <div class="desc"><p>A base class for objects with a name.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.Named', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.Named" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">Named</span><span class="p">(</span><span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">Named</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;A base class for objects with a name.</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+
+  <span class="n">regex</span> <span class="o">=</span> <span class="bp">None</span>
+  <span class="sd">&quot;&quot;&quot;re.RegexObject: a regular expression, the name must conform to&quot;&quot;&quot;</span>
+
+  <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Initializes the NamedAndDescribed instance</span>
+
+<span class="sd">    Args:</span>
+<span class="sd">      name (str): the name of the argument</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">toName</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
+
+  <span class="nd">@property</span>
+  <span class="k">def</span> <span class="nf">name</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
+    <span class="sd">&quot;&quot;&quot;str: the name&quot;&quot;&quot;</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__name</span>
+
+  <span class="nd">@classmethod</span>
+  <span class="k">def</span> <span class="nf">toName</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
+    <span class="sd">&quot;&quot;&quot;Converts the value into a name. If this is impossible a ValueError is</span>
+<span class="sd">    raised.</span>
+
+<span class="sd">    Args:</span>
+<span class="sd">      value (any): the value</span>
+<span class="sd">    Raises:</span>
+<span class="sd">      ValueError</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="n">value</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+    <span class="k">if</span> <span class="ow">not</span> <span class="bp">cls</span><span class="o">.</span><span class="n">regex</span><span class="o">.</span><span class="n">fullmatch</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;value {} must match {} fully&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">cls</span><span class="o">.</span><span class="n">regex</span><span class="o">.</span><span class="n">pattern</span><span class="p">))</span>
+    <span class="k">return</span> <span class="n">value</span>
+</pre></div>
+
+  </div>
+</div>
+
+
+      <div class="class">
+          <h3>Ancestors (in MRO)</h3>
+          <ul class="class_list">
+          <li><a href="/screwerk/supcon/intf.m.md#supcon.intf.Named">Named</a></li>
+          <li>supcon.util.Named</li>
+          <li>abc.ABC</li>
+          <li>builtins.object</li>
+          </ul>
+          <h3>Class variables</h3>
+            <div class="item">
+            <p id="supcon.intf.Named.regex" class="name">var <span class="ident">regex</span></p>
+            
+
+            
+  
+    <div class="desc"><p>re.RegexObject: a regular expression, the name must conform to</p></div>
+  <div class="source_cont">
+</div>
+
+            </div>
+          <h3>Class Methods</h3>
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.Named.toName">
+    <p>def <span class="ident">toName</span>(</p><p>cls, value)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Converts the value into a name. If this is impossible a ValueError is
+raised.</p>
+<p>Args:
+  value (any): the value
+Raises:
+  ValueError</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.Named.toName', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.Named.toName" class="source">
+    <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">toName</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
+  <span class="sd">&quot;&quot;&quot;Converts the value into a name. If this is impossible a ValueError is</span>
+<span class="sd">  raised.</span>
+<span class="sd">  Args:</span>
+<span class="sd">    value (any): the value</span>
+<span class="sd">  Raises:</span>
+<span class="sd">    ValueError</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="n">value</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+  <span class="k">if</span> <span class="ow">not</span> <span class="bp">cls</span><span class="o">.</span><span class="n">regex</span><span class="o">.</span><span class="n">fullmatch</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
+    <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;value {} must match {} fully&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">cls</span><span class="o">.</span><span class="n">regex</span><span class="o">.</span><span class="n">pattern</span><span class="p">))</span>
+  <span class="k">return</span> <span class="n">value</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+          <h3>Instance variables</h3>
+            <div class="item">
+            <p id="supcon.intf.Named.name" class="name">var <span class="ident">name</span></p>
+            
+
+            
+  
+    <div class="desc"><p>str: the name</p></div>
+  <div class="source_cont">
+</div>
+
+            </div>
+          <h3>Methods</h3>
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.Named.__init__">
+    <p>def <span class="ident">__init__</span>(</p><p>self, name)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Initializes the NamedAndDescribed instance</p>
+<p>Args:
+  name (str): the name of the argument</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.Named.__init__', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.Named.__init__" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;Initializes the NamedAndDescribed instance</span>
+<span class="sd">  Args:</span>
+<span class="sd">    name (str): the name of the argument</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">toName</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+      </div>
+      </div>
+      
+      <div class="item">
+      <p id="supcon.intf.NamedAndDescribed" class="name">class <span class="ident">NamedAndDescribed</span></p>
+      
+  
+    <div class="desc"><p>A base class for the interface describing classes <code>supcon.intf.Argument</code>,
+<code>supcon.intf.Event</code>, <code>supcon.intf.Method</code> and <code>supcon.intf.Interface</code> that
+all have the properties name and description.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.NamedAndDescribed', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.NamedAndDescribed" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">NamedAndDescribed</span><span class="p">(</span><span class="n">Named</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;A base class for the interface describing classes `supcon.intf.Argument`,</span>
+<span class="sd">  `supcon.intf.Event`, `supcon.intf.Method` and `supcon.intf.Interface` that</span>
+<span class="sd">  all have the properties name and description.&quot;&quot;&quot;</span>
+
+  <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">description</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Initializes the NamedAndDescribed instance</span>
+
+<span class="sd">    Args:</span>
+<span class="sd">      name (str): the name of the argument</span>
+<span class="sd">      description (str): a description of the argument</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="n">Named</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__description</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">toDescription</span><span class="p">(</span><span class="n">description</span><span class="p">)</span>
+
+  <span class="nd">@property</span>
+  <span class="k">def</span> <span class="nf">description</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
+    <span class="sd">&quot;&quot;&quot;str: a description&quot;&quot;&quot;</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__description</span>
+
+  <span class="nd">@classmethod</span>
+  <span class="k">def</span> <span class="nf">toDescription</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
+    <span class="sd">&quot;&quot;&quot;Converts the value into a description. If this is impossible a ValueError</span>
+<span class="sd">    is raised.</span>
+
+<span class="sd">    Args:</span>
+<span class="sd">      value (any): the value</span>
+<span class="sd">    Raises:</span>
+<span class="sd">      ValueError</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+
+      <div class="class">
+          <h3>Ancestors (in MRO)</h3>
+          <ul class="class_list">
+          <li><a href="/screwerk/supcon/intf.m.md#supcon.intf.NamedAndDescribed">NamedAndDescribed</a></li>
+          <li><a href="/screwerk/supcon/intf.m.md#supcon.intf.Named">Named</a></li>
+          <li>supcon.util.Named</li>
+          <li>abc.ABC</li>
+          <li>builtins.object</li>
+          </ul>
+          <h3>Class variables</h3>
+            <div class="item">
+            <p id="supcon.intf.NamedAndDescribed.regex" class="name">var <span class="ident">regex</span></p>
+            
+
+            
+  
+  <div class="source_cont">
+</div>
+
+            </div>
+          <h3>Class Methods</h3>
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.NamedAndDescribed.toDescription">
+    <p>def <span class="ident">toDescription</span>(</p><p>cls, value)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Converts the value into a description. If this is impossible a ValueError
+is raised.</p>
+<p>Args:
+  value (any): the value
+Raises:
+  ValueError</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.NamedAndDescribed.toDescription', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.NamedAndDescribed.toDescription" class="source">
+    <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">toDescription</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
+  <span class="sd">&quot;&quot;&quot;Converts the value into a description. If this is impossible a ValueError</span>
+<span class="sd">  is raised.</span>
+<span class="sd">  Args:</span>
+<span class="sd">    value (any): the value</span>
+<span class="sd">  Raises:</span>
+<span class="sd">    ValueError</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.NamedAndDescribed.toName">
+    <p>def <span class="ident">toName</span>(</p><p>cls, value)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Converts the value into a name. If this is impossible a ValueError is
+raised.</p>
+<p>Args:
+  value (any): the value
+Raises:
+  ValueError</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.NamedAndDescribed.toName', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.NamedAndDescribed.toName" class="source">
+    <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">toName</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
+  <span class="sd">&quot;&quot;&quot;Converts the value into a name. If this is impossible a ValueError is</span>
+<span class="sd">  raised.</span>
+<span class="sd">  Args:</span>
+<span class="sd">    value (any): the value</span>
+<span class="sd">  Raises:</span>
+<span class="sd">    ValueError</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="n">value</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+  <span class="k">if</span> <span class="ow">not</span> <span class="bp">cls</span><span class="o">.</span><span class="n">regex</span><span class="o">.</span><span class="n">fullmatch</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
+    <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;value {} must match {} fully&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">cls</span><span class="o">.</span><span class="n">regex</span><span class="o">.</span><span class="n">pattern</span><span class="p">))</span>
+  <span class="k">return</span> <span class="n">value</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+          <h3>Instance variables</h3>
+            <div class="item">
+            <p id="supcon.intf.NamedAndDescribed.description" class="name">var <span class="ident">description</span></p>
+            
+
+            
+  
+    <div class="desc"><p>str: a description</p></div>
+  <div class="source_cont">
+</div>
+
+            </div>
+            <div class="item">
+            <p id="supcon.intf.NamedAndDescribed.name" class="name">var <span class="ident">name</span></p>
+            
+
+            
+  
+    <div class="desc"><p>str: the name</p></div>
+  <div class="source_cont">
+</div>
+
+            </div>
+          <h3>Methods</h3>
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.NamedAndDescribed.__init__">
+    <p>def <span class="ident">__init__</span>(</p><p>self, name, description=&#39;&#39;)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Initializes the NamedAndDescribed instance</p>
+<p>Args:
+  name (str): the name of the argument
+  description (str): a description of the argument</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.NamedAndDescribed.__init__', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.NamedAndDescribed.__init__" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">description</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;Initializes the NamedAndDescribed instance</span>
+<span class="sd">  Args:</span>
+<span class="sd">    name (str): the name of the argument</span>
+<span class="sd">    description (str): a description of the argument</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="n">Named</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__description</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">toDescription</span><span class="p">(</span><span class="n">description</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+      </div>
+      </div>
+      
+      <div class="item">
+      <p id="supcon.intf.Node" class="name">class <span class="ident">Node</span></p>
+      
+  
+    <div class="desc"><p>The Node Interface. This class defines the methods that participants can
+use to access the supcon bus.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.Node', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.Node" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">Node</span><span class="p">(</span><span class="n">abc</span><span class="o">.</span><span class="n">ABC</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;The Node Interface. This class defines the methods that participants can</span>
+<span class="sd">  use to access the supcon bus.&quot;&quot;&quot;</span>
+
+  <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+    <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">()</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">toName</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
+
+  <span class="nd">@property</span>
+  <span class="k">def</span> <span class="nf">name</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
+    <span class="sd">&quot;&quot;&quot;str: The name of the node on the bus&quot;&quot;&quot;</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__name</span>
+
+  <span class="nd">@classmethod</span>
+  <span class="k">def</span> <span class="nf">toName</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
+    <span class="k">return</span> <span class="n">DNode</span><span class="o">.</span><span class="n">toName</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+
+  <span class="nd">@abc.abstractmethod</span>
+  <span class="k">def</span> <span class="nf">nodes</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">DNodes</span><span class="p">:</span>
+    <span class="sd">&quot;&quot;&quot;list[str]: The currently connected nodes&quot;&quot;&quot;</span>
+    <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
+
+  <span class="nd">@abc.abstractmethod</span>
+  <span class="k">def</span> <span class="nf">connect</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">endpoint</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Connects the node to the given endpoint.</span>
+
+<span class="sd">    If the connection failes or closes the connection gets reestablished with an</span>
+<span class="sd">    exponential timeout up to two minutes.</span>
+
+<span class="sd">    Args:</span>
+<span class="sd">      endpoint (twisted.internet.interfaces.IStreamClientEndpoint):</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
+
+  <span class="nd">@abc.abstractmethod</span>
+  <span class="k">def</span> <span class="nf">listen</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">endpoint</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Listens at the given endpoint for incoming connections</span>
+
+<span class="sd">    Args:</span>
+<span class="sd">      endpoint (twisted.internet.interfaces.IStreamServerEndpoint):</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
+
+  <span class="nd">@abc.abstractmethod</span>
+  <span class="k">def</span> <span class="nf">register</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">impl</span><span class="p">:</span> <span class="n">Implementation</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Registers an implementation with the node</span>
+
+<span class="sd">    Args:</span>
+<span class="sd">      impl (Implementation):</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
+
+  <span class="nd">@abc.abstractmethod</span>
+  <span class="k">def</span> <span class="nf">unregister</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">impl</span><span class="p">:</span> <span class="n">Implementation</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Removes an implementation from the node</span>
+
+<span class="sd">    Args:</span>
+<span class="sd">      impl (supcon.intf.Implementation):</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
+
+  <span class="nd">@abc.abstractmethod</span>
+  <span class="k">def</span> <span class="nf">call</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">intf</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">method</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+    <span class="sd">&quot;&quot;&quot;Calls a method on the bus</span>
+
+<span class="sd">    Args:</span>
+<span class="sd">      node (str): a node on the bus</span>
+<span class="sd">      path (str): a path on the given node</span>
+<span class="sd">      intf (str): an interface at the given path</span>
+<span class="sd">      method (str): a method of the given interface</span>
+<span class="sd">      args (dict): a dict of method arguments</span>
+
+<span class="sd">    Returns:</span>
+<span class="sd">      defer.Deferred:</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
+
+  <span class="nd">@abc.abstractmethod</span>
+  <span class="k">def</span> <span class="nf">on</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">intf</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">event</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">cb</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Registers a callback for an event on the bus</span>
+
+<span class="sd">    Args:</span>
+<span class="sd">      node (str): a node on the bus</span>
+<span class="sd">      path (str): a path on the given node</span>
+<span class="sd">      intf (str): an interface at the given path</span>
+<span class="sd">      event (str): a method of the given interface</span>
+<span class="sd">      cb (callable): a callable that gets called with a dict of event arguments</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
+
+  <span class="nd">@abc.abstractmethod</span>
+  <span class="k">def</span> <span class="nf">off</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">intf</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">event</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">cb</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Unregisters a callback for an event on the bus</span>
+
+<span class="sd">    Args:</span>
+<span class="sd">      node (str): a node on the bus</span>
+<span class="sd">      path (str): a path on the given node</span>
+<span class="sd">      intf (str): an interface at the given path</span>
+<span class="sd">      event (str): a method of the given interface</span>
+<span class="sd">      cb (callable): a callable that gets called with a dict of event arguments</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
+</pre></div>
+
+  </div>
+</div>
+
+
+      <div class="class">
+          <h3>Ancestors (in MRO)</h3>
+          <ul class="class_list">
+          <li><a href="/screwerk/supcon/intf.m.md#supcon.intf.Node">Node</a></li>
+          <li>abc.ABC</li>
+          <li>builtins.object</li>
+          </ul>
+          <h3>Class Methods</h3>
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.Node.toName">
+    <p>def <span class="ident">toName</span>(</p><p>cls, value)</p>
+    </div>
+    
+
+    
+  
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.Node.toName', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.Node.toName" class="source">
+    <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">toName</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
+  <span class="k">return</span> <span class="n">DNode</span><span class="o">.</span><span class="n">toName</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+          <h3>Instance variables</h3>
+            <div class="item">
+            <p id="supcon.intf.Node.name" class="name">var <span class="ident">name</span></p>
+            
+
+            
+  
+    <div class="desc"><p>str: The name of the node on the bus</p></div>
+  <div class="source_cont">
+</div>
+
+            </div>
+          <h3>Methods</h3>
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.Node.__init__">
+    <p>def <span class="ident">__init__</span>(</p><p>self, name)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Initialize self.  See help(type(self)) for accurate signature.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.Node.__init__', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.Node.__init__" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+  <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">()</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">toName</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.Node.call">
+    <p>def <span class="ident">call</span>(</p><p>self, node, path, intf, method, args)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Calls a method on the bus</p>
+<p>Args:
+  node (str): a node on the bus
+  path (str): a path on the given node
+  intf (str): an interface at the given path
+  method (str): a method of the given interface
+  args (dict): a dict of method arguments</p>
+<p>Returns:
+  defer.Deferred:</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.Node.call', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.Node.call" class="source">
+    <div class="codehilite"><pre><span></span><span class="nd">@abc.abstractmethod</span>
+<span class="k">def</span> <span class="nf">call</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">intf</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">method</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">args</span><span class="p">:</span> <span class="nb">dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+  <span class="sd">&quot;&quot;&quot;Calls a method on the bus</span>
+<span class="sd">  Args:</span>
+<span class="sd">    node (str): a node on the bus</span>
+<span class="sd">    path (str): a path on the given node</span>
+<span class="sd">    intf (str): an interface at the given path</span>
+<span class="sd">    method (str): a method of the given interface</span>
+<span class="sd">    args (dict): a dict of method arguments</span>
+<span class="sd">  Returns:</span>
+<span class="sd">    defer.Deferred:</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.Node.connect">
+    <p>def <span class="ident">connect</span>(</p><p>self, endpoint)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Connects the node to the given endpoint.</p>
+<p>If the connection failes or closes the connection gets reestablished with an
+exponential timeout up to two minutes.</p>
+<p>Args:
+  endpoint (twisted.internet.interfaces.IStreamClientEndpoint):</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.Node.connect', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.Node.connect" class="source">
+    <div class="codehilite"><pre><span></span><span class="nd">@abc.abstractmethod</span>
+<span class="k">def</span> <span class="nf">connect</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">endpoint</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;Connects the node to the given endpoint.</span>
+<span class="sd">  If the connection failes or closes the connection gets reestablished with an</span>
+<span class="sd">  exponential timeout up to two minutes.</span>
+<span class="sd">  Args:</span>
+<span class="sd">    endpoint (twisted.internet.interfaces.IStreamClientEndpoint):</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.Node.listen">
+    <p>def <span class="ident">listen</span>(</p><p>self, endpoint)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Listens at the given endpoint for incoming connections</p>
+<p>Args:
+  endpoint (twisted.internet.interfaces.IStreamServerEndpoint):</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.Node.listen', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.Node.listen" class="source">
+    <div class="codehilite"><pre><span></span><span class="nd">@abc.abstractmethod</span>
+<span class="k">def</span> <span class="nf">listen</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">endpoint</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;Listens at the given endpoint for incoming connections</span>
+<span class="sd">  Args:</span>
+<span class="sd">    endpoint (twisted.internet.interfaces.IStreamServerEndpoint):</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.Node.nodes">
+    <p>def <span class="ident">nodes</span>(</p><p>self)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>list[str]: The currently connected nodes</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.Node.nodes', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.Node.nodes" class="source">
+    <div class="codehilite"><pre><span></span><span class="nd">@abc.abstractmethod</span>
+<span class="k">def</span> <span class="nf">nodes</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">DNodes</span><span class="p">:</span>
+  <span class="sd">&quot;&quot;&quot;list[str]: The currently connected nodes&quot;&quot;&quot;</span>
+  <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.Node.off">
+    <p>def <span class="ident">off</span>(</p><p>self, node, path, intf, event, cb)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Unregisters a callback for an event on the bus</p>
+<p>Args:
+  node (str): a node on the bus
+  path (str): a path on the given node
+  intf (str): an interface at the given path
+  event (str): a method of the given interface
+  cb (callable): a callable that gets called with a dict of event arguments</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.Node.off', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.Node.off" class="source">
+    <div class="codehilite"><pre><span></span><span class="nd">@abc.abstractmethod</span>
+<span class="k">def</span> <span class="nf">off</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">intf</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">event</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">cb</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;Unregisters a callback for an event on the bus</span>
+<span class="sd">  Args:</span>
+<span class="sd">    node (str): a node on the bus</span>
+<span class="sd">    path (str): a path on the given node</span>
+<span class="sd">    intf (str): an interface at the given path</span>
+<span class="sd">    event (str): a method of the given interface</span>
+<span class="sd">    cb (callable): a callable that gets called with a dict of event arguments</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.Node.on">
+    <p>def <span class="ident">on</span>(</p><p>self, node, path, intf, event, cb)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Registers a callback for an event on the bus</p>
+<p>Args:
+  node (str): a node on the bus
+  path (str): a path on the given node
+  intf (str): an interface at the given path
+  event (str): a method of the given interface
+  cb (callable): a callable that gets called with a dict of event arguments</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.Node.on', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.Node.on" class="source">
+    <div class="codehilite"><pre><span></span><span class="nd">@abc.abstractmethod</span>
+<span class="k">def</span> <span class="nf">on</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">intf</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">event</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">cb</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;Registers a callback for an event on the bus</span>
+<span class="sd">  Args:</span>
+<span class="sd">    node (str): a node on the bus</span>
+<span class="sd">    path (str): a path on the given node</span>
+<span class="sd">    intf (str): an interface at the given path</span>
+<span class="sd">    event (str): a method of the given interface</span>
+<span class="sd">    cb (callable): a callable that gets called with a dict of event arguments</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.Node.register">
+    <p>def <span class="ident">register</span>(</p><p>self, path, impl)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Registers an implementation with the node</p>
+<p>Args:
+  impl (Implementation):</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.Node.register', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.Node.register" class="source">
+    <div class="codehilite"><pre><span></span><span class="nd">@abc.abstractmethod</span>
+<span class="k">def</span> <span class="nf">register</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">impl</span><span class="p">:</span> <span class="n">Implementation</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;Registers an implementation with the node</span>
+<span class="sd">  Args:</span>
+<span class="sd">    impl (Implementation):</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.Node.unregister">
+    <p>def <span class="ident">unregister</span>(</p><p>self, path, impl)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Removes an implementation from the node</p>
+<p>Args:
+  impl (supcon.intf.Implementation):</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.Node.unregister', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.Node.unregister" class="source">
+    <div class="codehilite"><pre><span></span><span class="nd">@abc.abstractmethod</span>
+<span class="k">def</span> <span class="nf">unregister</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">impl</span><span class="p">:</span> <span class="n">Implementation</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;Removes an implementation from the node</span>
+<span class="sd">  Args:</span>
+<span class="sd">    impl (supcon.intf.Implementation):</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+      </div>
+      </div>
+      
+      <div class="item">
+      <p id="supcon.intf.Object" class="name">class <span class="ident">Object</span></p>
+      
+  
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.Object', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.Object" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">Object</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+
+  <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">interfaces</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    Args:</span>
+<span class="sd">      interfaces (DInterfaces): the interfaces that are implemented by this Object</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">if</span> <span class="n">interfaces</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+      <span class="n">interfaces</span> <span class="o">=</span> <span class="p">[]</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__intfs</span> <span class="o">=</span> <span class="p">{}</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span> <span class="o">=</span> <span class="p">{}</span>
+
+    <span class="k">def</span> <span class="nf">getCallCb</span><span class="p">(</span><span class="n">intf</span><span class="p">):</span>
+      <span class="k">return</span> <span class="k">lambda</span> <span class="n">method</span><span class="p">,</span> <span class="n">inArgs</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__call</span><span class="p">(</span><span class="n">intf</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">inArgs</span><span class="p">)</span>
+
+    <span class="k">for</span> <span class="n">interface</span> <span class="ow">in</span> <span class="n">interfaces</span><span class="p">:</span>
+      <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">interface</span><span class="p">,</span> <span class="n">DInterface</span><span class="p">):</span>
+        <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;interface must be an instance of {}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">DInterface</span><span class="p">))</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__intfs</span><span class="p">[</span><span class="n">interface</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">interface</span>
+
+      <span class="n">implementation</span> <span class="o">=</span> <span class="n">Implementation</span><span class="p">(</span><span class="n">interface</span><span class="p">)</span>
+      <span class="n">callCb</span> <span class="o">=</span> <span class="n">getCallCb</span><span class="p">(</span><span class="n">implementation</span><span class="o">.</span><span class="n">intf</span><span class="p">)</span>
+      <span class="k">for</span> <span class="n">method</span> <span class="ow">in</span> <span class="n">interface</span><span class="o">.</span><span class="n">methods</span><span class="p">:</span>
+        <span class="n">implementation</span><span class="o">.</span><span class="n">setCallCb</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">callCb</span><span class="p">)</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">implementation</span><span class="o">.</span><span class="n">intf</span><span class="p">]</span> <span class="o">=</span> <span class="n">implementation</span>
+
+  <span class="nd">@property</span>
+  <span class="k">def</span> <span class="nf">interfaces</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__intfs</span><span class="o">.</span><span class="n">values</span><span class="p">()</span>
+
+  <span class="nd">@property</span>
+  <span class="k">def</span> <span class="nf">implementations</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="o">.</span><span class="n">values</span><span class="p">()</span>
+
+  <span class="k">def</span> <span class="nf">interface</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">intf</span><span class="p">):</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__intfs</span><span class="p">[</span><span class="n">intf</span><span class="p">]</span>
+
+  <span class="k">def</span> <span class="nf">implementation</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">intf</span><span class="p">):</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">intf</span><span class="p">]</span>
+
+  <span class="k">def</span> <span class="nf">__call</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">intf</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">method</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">inArgs</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+    <span class="k">pass</span>
+</pre></div>
+
+  </div>
+</div>
+
+
+      <div class="class">
+          <h3>Ancestors (in MRO)</h3>
+          <ul class="class_list">
+          <li><a href="/screwerk/supcon/intf.m.md#supcon.intf.Object">Object</a></li>
+          <li>builtins.object</li>
+          </ul>
+          <h3>Instance variables</h3>
+            <div class="item">
+            <p id="supcon.intf.Object.implementations" class="name">var <span class="ident">implementations</span></p>
+            
+
+            
+  
+  <div class="source_cont">
+</div>
+
+            </div>
+            <div class="item">
+            <p id="supcon.intf.Object.interfaces" class="name">var <span class="ident">interfaces</span></p>
+            
+
+            
+  
+  <div class="source_cont">
+</div>
+
+            </div>
+          <h3>Methods</h3>
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.Object.__init__">
+    <p>def <span class="ident">__init__</span>(</p><p>self, interfaces=None)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Args:
+interfaces (DInterfaces): the interfaces that are implemented by this Object</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.Object.__init__', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.Object.__init__" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">interfaces</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">  Args:</span>
+<span class="sd">    interfaces (DInterfaces): the interfaces that are implemented by this Object</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">if</span> <span class="n">interfaces</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+    <span class="n">interfaces</span> <span class="o">=</span> <span class="p">[]</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__intfs</span> <span class="o">=</span> <span class="p">{}</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span> <span class="o">=</span> <span class="p">{}</span>
+  <span class="k">def</span> <span class="nf">getCallCb</span><span class="p">(</span><span class="n">intf</span><span class="p">):</span>
+    <span class="k">return</span> <span class="k">lambda</span> <span class="n">method</span><span class="p">,</span> <span class="n">inArgs</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__call</span><span class="p">(</span><span class="n">intf</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">inArgs</span><span class="p">)</span>
+  <span class="k">for</span> <span class="n">interface</span> <span class="ow">in</span> <span class="n">interfaces</span><span class="p">:</span>
+    <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">interface</span><span class="p">,</span> <span class="n">DInterface</span><span class="p">):</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;interface must be an instance of {}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">DInterface</span><span class="p">))</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__intfs</span><span class="p">[</span><span class="n">interface</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">interface</span>
+    <span class="n">implementation</span> <span class="o">=</span> <span class="n">Implementation</span><span class="p">(</span><span class="n">interface</span><span class="p">)</span>
+    <span class="n">callCb</span> <span class="o">=</span> <span class="n">getCallCb</span><span class="p">(</span><span class="n">implementation</span><span class="o">.</span><span class="n">intf</span><span class="p">)</span>
+    <span class="k">for</span> <span class="n">method</span> <span class="ow">in</span> <span class="n">interface</span><span class="o">.</span><span class="n">methods</span><span class="p">:</span>
+      <span class="n">implementation</span><span class="o">.</span><span class="n">setCallCb</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">callCb</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">implementation</span><span class="o">.</span><span class="n">intf</span><span class="p">]</span> <span class="o">=</span> <span class="n">implementation</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.Object.implementation">
+    <p>def <span class="ident">implementation</span>(</p><p>self, intf)</p>
+    </div>
+    
+
+    
+  
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.Object.implementation', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.Object.implementation" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">implementation</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">intf</span><span class="p">):</span>
+  <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__impls</span><span class="p">[</span><span class="n">intf</span><span class="p">]</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.intf.Object.interface">
+    <p>def <span class="ident">interface</span>(</p><p>self, intf)</p>
+    </div>
+    
+
+    
+  
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.intf.Object.interface', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.intf.Object.interface" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">interface</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">intf</span><span class="p">):</span>
+  <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__intfs</span><span class="p">[</span><span class="n">intf</span><span class="p">]</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+      </div>
+      </div>
+
+  </section>
+
+    </article>
+</div>
diff --git a/doc/keyed.m.md b/doc/keyed.m.md
new file mode 100644 (file)
index 0000000..a902ffc
--- /dev/null
@@ -0,0 +1,753 @@
+<link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,300' rel='stylesheet' type='text/css'>
+
+
+<style type="text/css">
+
+  .CONTENT {
+    padding: 0;
+  }
+
+  #container {
+    display: flex;
+    flex-directtion: column;
+  }
+
+  #content {
+    padding: 30px;
+    border-left: 1px solid #ddd;
+  }
+  #sidebar {
+    padding: 30px;
+  }
+
+  #footer {
+    font-size: .75em;
+    padding: 5px 30px;
+    border-top: 1px solid #ddd;
+    text-align: right;
+  }
+  #footer p {
+    margin: 0 0 0 30px;
+    display: inline-block;
+  }
+
+  h1, h2, h3, h4, h5 {
+    font-weight: 300;
+  }
+  h1 {
+    font-size: 2.5em;
+    line-height: 1.1em;
+    margin: 0 0 .50em 0;
+  }
+
+  h2 {
+    font-size: 1.75em;
+    margin: 1em 0 .50em 0;
+  }
+
+  h3 {
+    margin: 25px 0 10px 0;
+  }
+
+  h4 {
+    margin: 0;
+    font-size: 105%;
+  }
+
+  a {
+    color: #058;
+    text-decoration: none;
+    transition: color .3s ease-in-out;
+  }
+
+  a:hover {
+    color: #e08524;
+    transition: color .3s ease-in-out;
+  }
+
+  pre, code, .mono, .name {
+    font-family: "Ubuntu Mono", "Cousine", "DejaVu Sans Mono", monospace;
+  }
+
+  .title .name {
+    font-weight: bold;
+  }
+  .section-title {
+    margin-top: 2em;
+  }
+  .ident {
+    color: #900;
+  }
+
+  code {
+    background: #f9f9f9;
+  } 
+
+  pre {
+    background: #fefefe;
+    border: 1px solid #ddd;
+    box-shadow: 2px 2px 0 #f3f3f3;
+    margin: 0 30px;
+    padding: 15px 30px;
+  }
+
+  .codehilite {
+    margin: 0 30px 10px 30px;
+  }
+
+    .codehilite pre {
+      margin: 0;
+    }
+    .codehilite .err { background: #ff3300; color: #fff !important; } 
+
+  table#module-list {
+    font-size: 110%;
+  }
+
+    table#module-list tr td:first-child {
+      padding-right: 10px;
+      white-space: nowrap;
+    }
+
+    table#module-list td {
+      vertical-align: top;
+      padding-bottom: 8px;
+    }
+
+      table#module-list td p {
+        margin: 0 0 7px 0;
+      }
+
+  .def {
+    display: table;
+  }
+
+    .def p {
+      display: table-cell;
+      vertical-align: top;
+      text-align: left;
+    }
+
+    .def p:first-child {
+      white-space: nowrap;
+    }
+
+    .def p:last-child {
+      width: 100%;
+    }
+
+
+  #index {
+    list-style-type: none;
+    margin: 0;
+    padding: 0;
+  }
+    ul#index .class_name {
+      /* font-size: 110%; */
+      font-weight: bold;
+    }
+    #index ul {
+      margin: 0;
+    }
+
+  .item {
+    margin: 0 0 15px 0;
+  }
+
+    .item .class {
+      margin: 0 0 25px 30px;
+    }
+
+      .item .class ul.class_list {
+        margin: 0 0 20px 0;
+      }
+
+    .item .name {
+      background: #fafafa;
+      margin: 0;
+      font-weight: bold;
+      padding: 5px 10px;
+      border-radius: 3px;
+      display: inline-block;
+      min-width: 40%;
+    }
+      .item .name:hover {
+        background: #f6f6f6;
+      }
+
+    .item .empty_desc {
+      margin: 0 0 5px 0;
+      padding: 0;
+    }
+
+    .item .inheritance {
+      margin: 3px 0 0 30px;
+    }
+
+    .item .inherited {
+      color: #666;
+    }
+
+    .item .desc {
+      padding: 0 8px;
+      margin: 0;
+    }
+
+      .item .desc p {
+        margin: 0 0 10px 0;
+      }
+
+    .source_cont {
+      margin: 0;
+      padding: 0;
+    }
+
+    .source_link a {
+      background: #ffc300;
+      font-weight: 400;
+      font-size: .75em;
+      text-transform: uppercase;
+      color: #fff;
+      text-shadow: 1px 1px 0 #f4b700;
+      
+      padding: 3px 8px;
+      border-radius: 2px;
+      transition: background .3s ease-in-out;
+    }
+      .source_link a:hover {
+        background: #FF7200;
+        text-shadow: none;
+        transition: background .3s ease-in-out;
+      }
+
+    .source {
+      display: none;
+      max-height: 600px;
+      overflow-y: scroll;
+      margin-bottom: 15px;
+    }
+
+      .source .codehilite {
+        margin: 0;
+      }
+
+  .desc h1, .desc h2, .desc h3 {
+    font-size: 100% !important;
+  }
+  .clear {
+    clear: both;
+  }
+
+  @media all and (max-width: 950px) {
+    #sidebar {
+      width: 35%;
+    }
+    #content {
+      width: 65%;
+    }
+  }
+  @media all and (max-width: 650px) {
+    #top {
+      display: none;
+    }
+    #sidebar {
+      float: none;
+      width: auto;
+    }
+    #content {
+      float: none;
+      width: auto;
+      padding: 30px;
+    }
+
+    #index ul {
+      padding: 0;
+      margin-bottom: 15px;
+    }
+    #index ul li {
+      display: inline-block;
+      margin-right: 30px;
+    }
+    #footer {
+      text-align: left;
+    }
+    #footer p {
+      display: block;
+      margin: inherit;
+    }
+  }
+
+  /*****************************/
+
+</style>
+
+<style type="text/css">
+.codehilite .hll { background-color: #ffffcc }
+.codehilite  { background: #f8f8f8; }
+.codehilite .c { color: #408080; font-style: italic } /* Comment */
+.codehilite .err { border: 1px solid #FF0000 } /* Error */
+.codehilite .k { color: #008000; font-weight: bold } /* Keyword */
+.codehilite .o { color: #666666 } /* Operator */
+.codehilite .ch { color: #408080; font-style: italic } /* Comment.Hashbang */
+.codehilite .cm { color: #408080; font-style: italic } /* Comment.Multiline */
+.codehilite .cp { color: #BC7A00 } /* Comment.Preproc */
+.codehilite .cpf { color: #408080; font-style: italic } /* Comment.PreprocFile */
+.codehilite .c1 { color: #408080; font-style: italic } /* Comment.Single */
+.codehilite .cs { color: #408080; font-style: italic } /* Comment.Special */
+.codehilite .gd { color: #A00000 } /* Generic.Deleted */
+.codehilite .ge { font-style: italic } /* Generic.Emph */
+.codehilite .gr { color: #FF0000 } /* Generic.Error */
+.codehilite .gh { color: #000080; font-weight: bold } /* Generic.Heading */
+.codehilite .gi { color: #00A000 } /* Generic.Inserted */
+.codehilite .go { color: #888888 } /* Generic.Output */
+.codehilite .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
+.codehilite .gs { font-weight: bold } /* Generic.Strong */
+.codehilite .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
+.codehilite .gt { color: #0044DD } /* Generic.Traceback */
+.codehilite .kc { color: #008000; font-weight: bold } /* Keyword.Constant */
+.codehilite .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
+.codehilite .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
+.codehilite .kp { color: #008000 } /* Keyword.Pseudo */
+.codehilite .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
+.codehilite .kt { color: #B00040 } /* Keyword.Type */
+.codehilite .m { color: #666666 } /* Literal.Number */
+.codehilite .s { color: #BA2121 } /* Literal.String */
+.codehilite .na { color: #7D9029 } /* Name.Attribute */
+.codehilite .nb { color: #008000 } /* Name.Builtin */
+.codehilite .nc { color: #0000FF; font-weight: bold } /* Name.Class */
+.codehilite .no { color: #880000 } /* Name.Constant */
+.codehilite .nd { color: #AA22FF } /* Name.Decorator */
+.codehilite .ni { color: #999999; font-weight: bold } /* Name.Entity */
+.codehilite .ne { color: #D2413A; font-weight: bold } /* Name.Exception */
+.codehilite .nf { color: #0000FF } /* Name.Function */
+.codehilite .nl { color: #A0A000 } /* Name.Label */
+.codehilite .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
+.codehilite .nt { color: #008000; font-weight: bold } /* Name.Tag */
+.codehilite .nv { color: #19177C } /* Name.Variable */
+.codehilite .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
+.codehilite .w { color: #bbbbbb } /* Text.Whitespace */
+.codehilite .mb { color: #666666 } /* Literal.Number.Bin */
+.codehilite .mf { color: #666666 } /* Literal.Number.Float */
+.codehilite .mh { color: #666666 } /* Literal.Number.Hex */
+.codehilite .mi { color: #666666 } /* Literal.Number.Integer */
+.codehilite .mo { color: #666666 } /* Literal.Number.Oct */
+.codehilite .sa { color: #BA2121 } /* Literal.String.Affix */
+.codehilite .sb { color: #BA2121 } /* Literal.String.Backtick */
+.codehilite .sc { color: #BA2121 } /* Literal.String.Char */
+.codehilite .dl { color: #BA2121 } /* Literal.String.Delimiter */
+.codehilite .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
+.codehilite .s2 { color: #BA2121 } /* Literal.String.Double */
+.codehilite .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */
+.codehilite .sh { color: #BA2121 } /* Literal.String.Heredoc */
+.codehilite .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */
+.codehilite .sx { color: #008000 } /* Literal.String.Other */
+.codehilite .sr { color: #BB6688 } /* Literal.String.Regex */
+.codehilite .s1 { color: #BA2121 } /* Literal.String.Single */
+.codehilite .ss { color: #19177C } /* Literal.String.Symbol */
+.codehilite .bp { color: #008000 } /* Name.Builtin.Pseudo */
+.codehilite .fm { color: #0000FF } /* Name.Function.Magic */
+.codehilite .vc { color: #19177C } /* Name.Variable.Class */
+.codehilite .vg { color: #19177C } /* Name.Variable.Global */
+.codehilite .vi { color: #19177C } /* Name.Variable.Instance */
+.codehilite .vm { color: #19177C } /* Name.Variable.Magic */
+.codehilite .il { color: #666666 } /* Literal.Number.Integer.Long */
+</style>
+
+<script type="text/javascript">
+function toggle(id, $link) {
+  $node = document.getElementById(id);
+  if (!$node) return;
+  if (!$node.style.display || $node.style.display == 'none') {
+    $node.style.display = 'block';
+    $link.innerHTML = 'Hide source &nequiv;';
+  } else {
+    $node.style.display = 'none';
+    $link.innerHTML = 'Show source &equiv;';
+  }
+}
+</script>
+
+<div id="container">
+    
+  
+  <div id="sidebar">
+    <a href="/screwerk/supcon">Doc</a>
+
+    <h1>Index</h1>
+    <ul id="index">
+
+    <li class="set"><h3><a href="/screwerk/supcon/keyed.m.md#header-functions">Functions</a></h3>
+      
+  <ul>
+    <li class="mono"><a href="/screwerk/supcon/keyed.m.md#supcon.keyed.callKeyedMethod">callKeyedMethod</a></li>
+    <li class="mono"><a href="/screwerk/supcon/keyed.m.md#supcon.keyed.iKeyedMethods">iKeyedMethods</a></li>
+    <li class="mono"><a href="/screwerk/supcon/keyed.m.md#supcon.keyed.keyedMethod">keyedMethod</a></li>
+    <li class="mono"><a href="/screwerk/supcon/keyed.m.md#supcon.keyed.lKeyedMethods">lKeyedMethods</a></li>
+    <li class="mono"><a href="/screwerk/supcon/keyed.m.md#supcon.keyed.mKeyedMethods">mKeyedMethods</a></li>
+  </ul>
+
+    </li>
+
+    <li class="set"><h3><a href="/screwerk/supcon/keyed.m.md#header-classes">Classes</a></h3>
+      <ul>
+        <li class="mono">
+        <span class="class_name"><a href="/screwerk/supcon/keyed.m.md#supcon.keyed.KeyedMethod">KeyedMethod</a></span>
+        
+          
+  <ul>
+    <li class="mono"><a href="/screwerk/supcon/keyed.m.md#supcon.keyed.KeyedMethod.__init__">__init__</a></li>
+  </ul>
+
+        </li>
+      </ul>
+    </li>
+
+    </ul>
+  </div>
+
+    <article id="content">
+      
+  
+
+  
+
+
+  <header id="section-intro">
+  <h1 class="title"><span class="name">supcon.keyed</span> module</h1>
+  
+  
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.keyed', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.keyed" class="source">
+    <div class="codehilite"><pre><span></span><span class="n">lass</span> <span class="n">KeyedMethod</span><span class="p">():</span>
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">fget</span><span class="p">):</span>
+   <span class="bp">self</span><span class="o">.</span><span class="n">__key</span> <span class="o">=</span> <span class="n">key</span>
+   <span class="bp">self</span><span class="o">.</span><span class="n">__fget</span> <span class="o">=</span> <span class="n">fget</span>
+   <span class="bp">self</span><span class="o">.</span><span class="vm">__doc__</span> <span class="o">=</span> <span class="n">fget</span><span class="o">.</span><span class="vm">__doc__</span>
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">key</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+   <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__key</span>
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">fget</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+   <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__fget</span>
+ <span class="k">def</span> <span class="fm">__get__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">objType</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+   <span class="k">if</span> <span class="n">obj</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+     <span class="k">return</span> <span class="bp">self</span>
+   <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__fget</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+     <span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span><span class="s2">&quot;unreadable attribute&quot;</span><span class="p">)</span>
+   <span class="k">return</span> <span class="k">lambda</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__fget</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
+<span class="n">ef</span> <span class="n">lKeyedMethods</span><span class="p">(</span><span class="n">aClass</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Returns a dict of all KeyedMethods of the given class indexed by attribute</span>
+<span class="sd"> name. The dict does not contain the KeyedMethods of any super class.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="n">aClass</span> <span class="ow">is</span> <span class="nb">object</span><span class="p">:</span>
+   <span class="k">return</span> <span class="p">{}</span>
+ <span class="n">lAttrs</span> <span class="o">=</span> <span class="nb">vars</span><span class="p">(</span><span class="n">aClass</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="s1">&#39;_lKeyedMethods&#39;</span> <span class="ow">in</span> <span class="n">lAttrs</span><span class="p">:</span>
+   <span class="n">methods</span> <span class="o">=</span> <span class="p">{}</span>
+   <span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">attr</span> <span class="ow">in</span> <span class="n">lAttrs</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+     <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">attr</span><span class="p">,</span> <span class="n">KeyedMethod</span><span class="p">):</span>
+       <span class="n">methods</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">attr</span>
+   <span class="n">aClass</span><span class="o">.</span><span class="n">_lKeyedMethods</span> <span class="o">=</span> <span class="n">methods</span>
+ <span class="k">return</span> <span class="n">aClass</span><span class="o">.</span><span class="n">_lKeyedMethods</span>
+<span class="n">ef</span> <span class="n">mKeyedMethods</span><span class="p">(</span><span class="n">aClass</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Returns a dict of all KeyedMethods of the given class indexed by attribute</span>
+<span class="sd"> name. The dict contains the KeyedMethods of all super classes that are not</span>
+<span class="sd"> hidden by the method resolution order.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="s1">&#39;_mKeyedMethods&#39;</span> <span class="ow">in</span> <span class="nb">vars</span><span class="p">(</span><span class="n">aClass</span><span class="p">):</span>
+   <span class="n">methods</span> <span class="o">=</span> <span class="p">{}</span>
+   <span class="k">for</span> <span class="n">sClass</span> <span class="ow">in</span> <span class="nb">reversed</span><span class="p">(</span><span class="n">aClass</span><span class="o">.</span><span class="n">mro</span><span class="p">()):</span>
+     <span class="n">methods</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">lKeyedMethods</span><span class="p">(</span><span class="n">sClass</span><span class="p">))</span>
+   <span class="n">aClass</span><span class="o">.</span><span class="n">_mKeyedMethods</span> <span class="o">=</span> <span class="n">methods</span>
+ <span class="k">return</span> <span class="n">aClass</span><span class="o">.</span><span class="n">_mKeyedMethods</span>
+<span class="n">ef</span> <span class="n">iKeyedMethods</span><span class="p">(</span><span class="n">aClass</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Returns a dict of all KeyedMethods of the given class indexed by key. The dict</span>
+<span class="sd"> contains the KeyedMethods of all super classes that are not hidden by the</span>
+<span class="sd"> method resolution order.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="s1">&#39;_iKeyedMethods&#39;</span> <span class="ow">in</span> <span class="nb">vars</span><span class="p">(</span><span class="n">aClass</span><span class="p">):</span>
+   <span class="n">methods</span> <span class="o">=</span> <span class="p">{}</span>
+   <span class="k">for</span> <span class="n">_name</span><span class="p">,</span> <span class="n">attr</span> <span class="ow">in</span> <span class="n">mKeyedMethods</span><span class="p">(</span><span class="n">aClass</span><span class="p">)</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+     <span class="k">if</span> <span class="n">attr</span><span class="o">.</span><span class="n">key</span> <span class="ow">in</span> <span class="n">methods</span><span class="p">:</span>
+       <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">()</span>
+     <span class="n">methods</span><span class="p">[</span><span class="n">attr</span><span class="o">.</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">attr</span>
+   <span class="n">aClass</span><span class="o">.</span><span class="n">_iKeyedMethods</span> <span class="o">=</span> <span class="n">methods</span>
+ <span class="k">return</span> <span class="n">aClass</span><span class="o">.</span><span class="n">_iKeyedMethods</span>
+<span class="n">ef</span> <span class="n">keyedMethod</span><span class="p">(</span><span class="n">key</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Can be used to decorate a method with a key</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="k">lambda</span> <span class="n">fget</span><span class="p">:</span> <span class="n">KeyedMethod</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">fget</span><span class="p">)</span>
+<span class="n">ef</span> <span class="n">callKeyedMethod</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Resolves a keyed method by the given key and and calls it with the given</span>
+<span class="sd"> arguments.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">iKeyedMethods</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">obj</span><span class="p">))[</span><span class="n">key</span><span class="p">]</span><span class="o">.</span><span class="fm">__get__</span><span class="p">(</span><span class="n">obj</span><span class="p">)(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+
+  </header>
+
+  <section id="section-items">
+
+    <h2 class="section-title" id="header-functions">Functions</h2>
+      
+  <div class="item">
+    <div class="name def" id="supcon.keyed.callKeyedMethod">
+    <p>def <span class="ident">callKeyedMethod</span>(</p><p>obj, key, *args, **kwargs)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Resolves a keyed method by the given key and and calls it with the given
+arguments.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.keyed.callKeyedMethod', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.keyed.callKeyedMethod" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">callKeyedMethod</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">  Resolves a keyed method by the given key and and calls it with the given</span>
+<span class="sd">  arguments.</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">return</span> <span class="n">iKeyedMethods</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">obj</span><span class="p">))[</span><span class="n">key</span><span class="p">]</span><span class="o">.</span><span class="fm">__get__</span><span class="p">(</span><span class="n">obj</span><span class="p">)(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+      
+  <div class="item">
+    <div class="name def" id="supcon.keyed.iKeyedMethods">
+    <p>def <span class="ident">iKeyedMethods</span>(</p><p>aClass)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Returns a dict of all KeyedMethods of the given class indexed by key. The dict
+contains the KeyedMethods of all super classes that are not hidden by the
+method resolution order.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.keyed.iKeyedMethods', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.keyed.iKeyedMethods" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">iKeyedMethods</span><span class="p">(</span><span class="n">aClass</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">  Returns a dict of all KeyedMethods of the given class indexed by key. The dict</span>
+<span class="sd">  contains the KeyedMethods of all super classes that are not hidden by the</span>
+<span class="sd">  method resolution order.</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">if</span> <span class="ow">not</span> <span class="s1">&#39;_iKeyedMethods&#39;</span> <span class="ow">in</span> <span class="nb">vars</span><span class="p">(</span><span class="n">aClass</span><span class="p">):</span>
+    <span class="n">methods</span> <span class="o">=</span> <span class="p">{}</span>
+    <span class="k">for</span> <span class="n">_name</span><span class="p">,</span> <span class="n">attr</span> <span class="ow">in</span> <span class="n">mKeyedMethods</span><span class="p">(</span><span class="n">aClass</span><span class="p">)</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+      <span class="k">if</span> <span class="n">attr</span><span class="o">.</span><span class="n">key</span> <span class="ow">in</span> <span class="n">methods</span><span class="p">:</span>
+        <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">()</span>
+      <span class="n">methods</span><span class="p">[</span><span class="n">attr</span><span class="o">.</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">attr</span>
+    <span class="n">aClass</span><span class="o">.</span><span class="n">_iKeyedMethods</span> <span class="o">=</span> <span class="n">methods</span>
+  <span class="k">return</span> <span class="n">aClass</span><span class="o">.</span><span class="n">_iKeyedMethods</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+      
+  <div class="item">
+    <div class="name def" id="supcon.keyed.keyedMethod">
+    <p>def <span class="ident">keyedMethod</span>(</p><p>key)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Can be used to decorate a method with a key</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.keyed.keyedMethod', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.keyed.keyedMethod" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">keyedMethod</span><span class="p">(</span><span class="n">key</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">  Can be used to decorate a method with a key</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">return</span> <span class="k">lambda</span> <span class="n">fget</span><span class="p">:</span> <span class="n">KeyedMethod</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">fget</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+      
+  <div class="item">
+    <div class="name def" id="supcon.keyed.lKeyedMethods">
+    <p>def <span class="ident">lKeyedMethods</span>(</p><p>aClass)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Returns a dict of all KeyedMethods of the given class indexed by attribute
+name. The dict does not contain the KeyedMethods of any super class.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.keyed.lKeyedMethods', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.keyed.lKeyedMethods" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">lKeyedMethods</span><span class="p">(</span><span class="n">aClass</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">  Returns a dict of all KeyedMethods of the given class indexed by attribute</span>
+<span class="sd">  name. The dict does not contain the KeyedMethods of any super class.</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">if</span> <span class="n">aClass</span> <span class="ow">is</span> <span class="nb">object</span><span class="p">:</span>
+    <span class="k">return</span> <span class="p">{}</span>
+
+  <span class="n">lAttrs</span> <span class="o">=</span> <span class="nb">vars</span><span class="p">(</span><span class="n">aClass</span><span class="p">)</span>
+  <span class="k">if</span> <span class="ow">not</span> <span class="s1">&#39;_lKeyedMethods&#39;</span> <span class="ow">in</span> <span class="n">lAttrs</span><span class="p">:</span>
+    <span class="n">methods</span> <span class="o">=</span> <span class="p">{}</span>
+    <span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">attr</span> <span class="ow">in</span> <span class="n">lAttrs</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+      <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">attr</span><span class="p">,</span> <span class="n">KeyedMethod</span><span class="p">):</span>
+        <span class="n">methods</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">attr</span>
+    <span class="n">aClass</span><span class="o">.</span><span class="n">_lKeyedMethods</span> <span class="o">=</span> <span class="n">methods</span>
+  <span class="k">return</span> <span class="n">aClass</span><span class="o">.</span><span class="n">_lKeyedMethods</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+      
+  <div class="item">
+    <div class="name def" id="supcon.keyed.mKeyedMethods">
+    <p>def <span class="ident">mKeyedMethods</span>(</p><p>aClass)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Returns a dict of all KeyedMethods of the given class indexed by attribute
+name. The dict contains the KeyedMethods of all super classes that are not
+hidden by the method resolution order.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.keyed.mKeyedMethods', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.keyed.mKeyedMethods" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">mKeyedMethods</span><span class="p">(</span><span class="n">aClass</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">  Returns a dict of all KeyedMethods of the given class indexed by attribute</span>
+<span class="sd">  name. The dict contains the KeyedMethods of all super classes that are not</span>
+<span class="sd">  hidden by the method resolution order.</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">if</span> <span class="ow">not</span> <span class="s1">&#39;_mKeyedMethods&#39;</span> <span class="ow">in</span> <span class="nb">vars</span><span class="p">(</span><span class="n">aClass</span><span class="p">):</span>
+    <span class="n">methods</span> <span class="o">=</span> <span class="p">{}</span>
+    <span class="k">for</span> <span class="n">sClass</span> <span class="ow">in</span> <span class="nb">reversed</span><span class="p">(</span><span class="n">aClass</span><span class="o">.</span><span class="n">mro</span><span class="p">()):</span>
+      <span class="n">methods</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">lKeyedMethods</span><span class="p">(</span><span class="n">sClass</span><span class="p">))</span>
+    <span class="n">aClass</span><span class="o">.</span><span class="n">_mKeyedMethods</span> <span class="o">=</span> <span class="n">methods</span>
+  <span class="k">return</span> <span class="n">aClass</span><span class="o">.</span><span class="n">_mKeyedMethods</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+
+    <h2 class="section-title" id="header-classes">Classes</h2>
+      
+      <div class="item">
+      <p id="supcon.keyed.KeyedMethod" class="name">class <span class="ident">KeyedMethod</span></p>
+      
+  
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.keyed.KeyedMethod', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.keyed.KeyedMethod" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">KeyedMethod</span><span class="p">():</span>
+
+  <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">fget</span><span class="p">):</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__key</span> <span class="o">=</span> <span class="n">key</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__fget</span> <span class="o">=</span> <span class="n">fget</span>
+    <span class="bp">self</span><span class="o">.</span><span class="vm">__doc__</span> <span class="o">=</span> <span class="n">fget</span><span class="o">.</span><span class="vm">__doc__</span>
+
+  <span class="nd">@property</span>
+  <span class="k">def</span> <span class="nf">key</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__key</span>
+
+  <span class="nd">@property</span>
+  <span class="k">def</span> <span class="nf">fget</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__fget</span>
+
+  <span class="k">def</span> <span class="fm">__get__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">objType</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+    <span class="k">if</span> <span class="n">obj</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+      <span class="k">return</span> <span class="bp">self</span>
+    <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__fget</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+      <span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span><span class="s2">&quot;unreadable attribute&quot;</span><span class="p">)</span>
+    <span class="k">return</span> <span class="k">lambda</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__fget</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+
+      <div class="class">
+          <h3>Ancestors (in MRO)</h3>
+          <ul class="class_list">
+          <li><a href="/screwerk/supcon/keyed.m.md#supcon.keyed.KeyedMethod">KeyedMethod</a></li>
+          <li>builtins.object</li>
+          </ul>
+          <h3>Instance variables</h3>
+            <div class="item">
+            <p id="supcon.keyed.KeyedMethod.fget" class="name">var <span class="ident">fget</span></p>
+            
+
+            
+  
+  <div class="source_cont">
+</div>
+
+            </div>
+            <div class="item">
+            <p id="supcon.keyed.KeyedMethod.key" class="name">var <span class="ident">key</span></p>
+            
+
+            
+  
+  <div class="source_cont">
+</div>
+
+            </div>
+          <h3>Methods</h3>
+            
+  <div class="item">
+    <div class="name def" id="supcon.keyed.KeyedMethod.__init__">
+    <p>def <span class="ident">__init__</span>(</p><p>self, key, fget)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Initialize self.  See help(type(self)) for accurate signature.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.keyed.KeyedMethod.__init__', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.keyed.KeyedMethod.__init__" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">fget</span><span class="p">):</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__key</span> <span class="o">=</span> <span class="n">key</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__fget</span> <span class="o">=</span> <span class="n">fget</span>
+  <span class="bp">self</span><span class="o">.</span><span class="vm">__doc__</span> <span class="o">=</span> <span class="n">fget</span><span class="o">.</span><span class="vm">__doc__</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+      </div>
+      </div>
+
+  </section>
+
+    </article>
+</div>
diff --git a/doc/store.m.md b/doc/store.m.md
new file mode 100644 (file)
index 0000000..c746418
--- /dev/null
@@ -0,0 +1,851 @@
+<link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,300' rel='stylesheet' type='text/css'>
+
+
+<style type="text/css">
+
+  .CONTENT {
+    padding: 0;
+  }
+
+  #container {
+    display: flex;
+    flex-directtion: column;
+  }
+
+  #content {
+    padding: 30px;
+    border-left: 1px solid #ddd;
+  }
+  #sidebar {
+    padding: 30px;
+  }
+
+  #footer {
+    font-size: .75em;
+    padding: 5px 30px;
+    border-top: 1px solid #ddd;
+    text-align: right;
+  }
+  #footer p {
+    margin: 0 0 0 30px;
+    display: inline-block;
+  }
+
+  h1, h2, h3, h4, h5 {
+    font-weight: 300;
+  }
+  h1 {
+    font-size: 2.5em;
+    line-height: 1.1em;
+    margin: 0 0 .50em 0;
+  }
+
+  h2 {
+    font-size: 1.75em;
+    margin: 1em 0 .50em 0;
+  }
+
+  h3 {
+    margin: 25px 0 10px 0;
+  }
+
+  h4 {
+    margin: 0;
+    font-size: 105%;
+  }
+
+  a {
+    color: #058;
+    text-decoration: none;
+    transition: color .3s ease-in-out;
+  }
+
+  a:hover {
+    color: #e08524;
+    transition: color .3s ease-in-out;
+  }
+
+  pre, code, .mono, .name {
+    font-family: "Ubuntu Mono", "Cousine", "DejaVu Sans Mono", monospace;
+  }
+
+  .title .name {
+    font-weight: bold;
+  }
+  .section-title {
+    margin-top: 2em;
+  }
+  .ident {
+    color: #900;
+  }
+
+  code {
+    background: #f9f9f9;
+  } 
+
+  pre {
+    background: #fefefe;
+    border: 1px solid #ddd;
+    box-shadow: 2px 2px 0 #f3f3f3;
+    margin: 0 30px;
+    padding: 15px 30px;
+  }
+
+  .codehilite {
+    margin: 0 30px 10px 30px;
+  }
+
+    .codehilite pre {
+      margin: 0;
+    }
+    .codehilite .err { background: #ff3300; color: #fff !important; } 
+
+  table#module-list {
+    font-size: 110%;
+  }
+
+    table#module-list tr td:first-child {
+      padding-right: 10px;
+      white-space: nowrap;
+    }
+
+    table#module-list td {
+      vertical-align: top;
+      padding-bottom: 8px;
+    }
+
+      table#module-list td p {
+        margin: 0 0 7px 0;
+      }
+
+  .def {
+    display: table;
+  }
+
+    .def p {
+      display: table-cell;
+      vertical-align: top;
+      text-align: left;
+    }
+
+    .def p:first-child {
+      white-space: nowrap;
+    }
+
+    .def p:last-child {
+      width: 100%;
+    }
+
+
+  #index {
+    list-style-type: none;
+    margin: 0;
+    padding: 0;
+  }
+    ul#index .class_name {
+      /* font-size: 110%; */
+      font-weight: bold;
+    }
+    #index ul {
+      margin: 0;
+    }
+
+  .item {
+    margin: 0 0 15px 0;
+  }
+
+    .item .class {
+      margin: 0 0 25px 30px;
+    }
+
+      .item .class ul.class_list {
+        margin: 0 0 20px 0;
+      }
+
+    .item .name {
+      background: #fafafa;
+      margin: 0;
+      font-weight: bold;
+      padding: 5px 10px;
+      border-radius: 3px;
+      display: inline-block;
+      min-width: 40%;
+    }
+      .item .name:hover {
+        background: #f6f6f6;
+      }
+
+    .item .empty_desc {
+      margin: 0 0 5px 0;
+      padding: 0;
+    }
+
+    .item .inheritance {
+      margin: 3px 0 0 30px;
+    }
+
+    .item .inherited {
+      color: #666;
+    }
+
+    .item .desc {
+      padding: 0 8px;
+      margin: 0;
+    }
+
+      .item .desc p {
+        margin: 0 0 10px 0;
+      }
+
+    .source_cont {
+      margin: 0;
+      padding: 0;
+    }
+
+    .source_link a {
+      background: #ffc300;
+      font-weight: 400;
+      font-size: .75em;
+      text-transform: uppercase;
+      color: #fff;
+      text-shadow: 1px 1px 0 #f4b700;
+      
+      padding: 3px 8px;
+      border-radius: 2px;
+      transition: background .3s ease-in-out;
+    }
+      .source_link a:hover {
+        background: #FF7200;
+        text-shadow: none;
+        transition: background .3s ease-in-out;
+      }
+
+    .source {
+      display: none;
+      max-height: 600px;
+      overflow-y: scroll;
+      margin-bottom: 15px;
+    }
+
+      .source .codehilite {
+        margin: 0;
+      }
+
+  .desc h1, .desc h2, .desc h3 {
+    font-size: 100% !important;
+  }
+  .clear {
+    clear: both;
+  }
+
+  @media all and (max-width: 950px) {
+    #sidebar {
+      width: 35%;
+    }
+    #content {
+      width: 65%;
+    }
+  }
+  @media all and (max-width: 650px) {
+    #top {
+      display: none;
+    }
+    #sidebar {
+      float: none;
+      width: auto;
+    }
+    #content {
+      float: none;
+      width: auto;
+      padding: 30px;
+    }
+
+    #index ul {
+      padding: 0;
+      margin-bottom: 15px;
+    }
+    #index ul li {
+      display: inline-block;
+      margin-right: 30px;
+    }
+    #footer {
+      text-align: left;
+    }
+    #footer p {
+      display: block;
+      margin: inherit;
+    }
+  }
+
+  /*****************************/
+
+</style>
+
+<style type="text/css">
+.codehilite .hll { background-color: #ffffcc }
+.codehilite  { background: #f8f8f8; }
+.codehilite .c { color: #408080; font-style: italic } /* Comment */
+.codehilite .err { border: 1px solid #FF0000 } /* Error */
+.codehilite .k { color: #008000; font-weight: bold } /* Keyword */
+.codehilite .o { color: #666666 } /* Operator */
+.codehilite .ch { color: #408080; font-style: italic } /* Comment.Hashbang */
+.codehilite .cm { color: #408080; font-style: italic } /* Comment.Multiline */
+.codehilite .cp { color: #BC7A00 } /* Comment.Preproc */
+.codehilite .cpf { color: #408080; font-style: italic } /* Comment.PreprocFile */
+.codehilite .c1 { color: #408080; font-style: italic } /* Comment.Single */
+.codehilite .cs { color: #408080; font-style: italic } /* Comment.Special */
+.codehilite .gd { color: #A00000 } /* Generic.Deleted */
+.codehilite .ge { font-style: italic } /* Generic.Emph */
+.codehilite .gr { color: #FF0000 } /* Generic.Error */
+.codehilite .gh { color: #000080; font-weight: bold } /* Generic.Heading */
+.codehilite .gi { color: #00A000 } /* Generic.Inserted */
+.codehilite .go { color: #888888 } /* Generic.Output */
+.codehilite .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
+.codehilite .gs { font-weight: bold } /* Generic.Strong */
+.codehilite .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
+.codehilite .gt { color: #0044DD } /* Generic.Traceback */
+.codehilite .kc { color: #008000; font-weight: bold } /* Keyword.Constant */
+.codehilite .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
+.codehilite .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
+.codehilite .kp { color: #008000 } /* Keyword.Pseudo */
+.codehilite .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
+.codehilite .kt { color: #B00040 } /* Keyword.Type */
+.codehilite .m { color: #666666 } /* Literal.Number */
+.codehilite .s { color: #BA2121 } /* Literal.String */
+.codehilite .na { color: #7D9029 } /* Name.Attribute */
+.codehilite .nb { color: #008000 } /* Name.Builtin */
+.codehilite .nc { color: #0000FF; font-weight: bold } /* Name.Class */
+.codehilite .no { color: #880000 } /* Name.Constant */
+.codehilite .nd { color: #AA22FF } /* Name.Decorator */
+.codehilite .ni { color: #999999; font-weight: bold } /* Name.Entity */
+.codehilite .ne { color: #D2413A; font-weight: bold } /* Name.Exception */
+.codehilite .nf { color: #0000FF } /* Name.Function */
+.codehilite .nl { color: #A0A000 } /* Name.Label */
+.codehilite .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
+.codehilite .nt { color: #008000; font-weight: bold } /* Name.Tag */
+.codehilite .nv { color: #19177C } /* Name.Variable */
+.codehilite .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
+.codehilite .w { color: #bbbbbb } /* Text.Whitespace */
+.codehilite .mb { color: #666666 } /* Literal.Number.Bin */
+.codehilite .mf { color: #666666 } /* Literal.Number.Float */
+.codehilite .mh { color: #666666 } /* Literal.Number.Hex */
+.codehilite .mi { color: #666666 } /* Literal.Number.Integer */
+.codehilite .mo { color: #666666 } /* Literal.Number.Oct */
+.codehilite .sa { color: #BA2121 } /* Literal.String.Affix */
+.codehilite .sb { color: #BA2121 } /* Literal.String.Backtick */
+.codehilite .sc { color: #BA2121 } /* Literal.String.Char */
+.codehilite .dl { color: #BA2121 } /* Literal.String.Delimiter */
+.codehilite .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
+.codehilite .s2 { color: #BA2121 } /* Literal.String.Double */
+.codehilite .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */
+.codehilite .sh { color: #BA2121 } /* Literal.String.Heredoc */
+.codehilite .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */
+.codehilite .sx { color: #008000 } /* Literal.String.Other */
+.codehilite .sr { color: #BB6688 } /* Literal.String.Regex */
+.codehilite .s1 { color: #BA2121 } /* Literal.String.Single */
+.codehilite .ss { color: #19177C } /* Literal.String.Symbol */
+.codehilite .bp { color: #008000 } /* Name.Builtin.Pseudo */
+.codehilite .fm { color: #0000FF } /* Name.Function.Magic */
+.codehilite .vc { color: #19177C } /* Name.Variable.Class */
+.codehilite .vg { color: #19177C } /* Name.Variable.Global */
+.codehilite .vi { color: #19177C } /* Name.Variable.Instance */
+.codehilite .vm { color: #19177C } /* Name.Variable.Magic */
+.codehilite .il { color: #666666 } /* Literal.Number.Integer.Long */
+</style>
+
+<script type="text/javascript">
+function toggle(id, $link) {
+  $node = document.getElementById(id);
+  if (!$node) return;
+  if (!$node.style.display || $node.style.display == 'none') {
+    $node.style.display = 'block';
+    $link.innerHTML = 'Hide source &nequiv;';
+  } else {
+    $node.style.display = 'none';
+    $link.innerHTML = 'Show source &equiv;';
+  }
+}
+</script>
+
+<div id="container">
+    
+  
+  <div id="sidebar">
+    <a href="/screwerk/supcon">Doc</a>
+
+    <h1>Index</h1>
+    <ul id="index">
+
+    <li class="set"><h3><a href="/screwerk/supcon/store.m.md#header-functions">Functions</a></h3>
+      
+  <ul>
+    <li class="mono"><a href="/screwerk/supcon/store.m.md#supcon.store.readFile">readFile</a></li>
+    <li class="mono"><a href="/screwerk/supcon/store.m.md#supcon.store.writeFile">writeFile</a></li>
+  </ul>
+
+    </li>
+
+    <li class="set"><h3><a href="/screwerk/supcon/store.m.md#header-classes">Classes</a></h3>
+      <ul>
+        <li class="mono">
+        <span class="class_name"><a href="/screwerk/supcon/store.m.md#supcon.store.FileStore">FileStore</a></span>
+        
+          
+  <ul>
+    <li class="mono"><a href="/screwerk/supcon/store.m.md#supcon.store.FileStore.__init__">__init__</a></li>
+    <li class="mono"><a href="/screwerk/supcon/store.m.md#supcon.store.FileStore.delete">delete</a></li>
+    <li class="mono"><a href="/screwerk/supcon/store.m.md#supcon.store.FileStore.load">load</a></li>
+    <li class="mono"><a href="/screwerk/supcon/store.m.md#supcon.store.FileStore.store">store</a></li>
+  </ul>
+
+        </li>
+        <li class="mono">
+        <span class="class_name"><a href="/screwerk/supcon/store.m.md#supcon.store.Store">Store</a></span>
+        
+          
+  <ul>
+    <li class="mono"><a href="/screwerk/supcon/store.m.md#supcon.store.Store.delete">delete</a></li>
+    <li class="mono"><a href="/screwerk/supcon/store.m.md#supcon.store.Store.load">load</a></li>
+    <li class="mono"><a href="/screwerk/supcon/store.m.md#supcon.store.Store.store">store</a></li>
+  </ul>
+
+        </li>
+      </ul>
+    </li>
+
+    </ul>
+  </div>
+
+    <article id="content">
+      
+  
+
+  
+
+
+  <header id="section-intro">
+  <h1 class="title"><span class="name">supcon.store</span> module</h1>
+  
+  
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.store', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.store" class="source">
+    <div class="codehilite"><pre><span></span><span class="n">mport</span> <span class="n">msgpack</span>
+<span class="n">mport</span> <span class="n">twisted</span><span class="o">.</span><span class="n">internet</span><span class="o">.</span><span class="n">defer</span> <span class="k">as</span> <span class="n">defer</span>
+<span class="n">mport</span> <span class="n">twisted</span><span class="o">.</span><span class="n">internet</span><span class="o">.</span><span class="n">threads</span> <span class="k">as</span> <span class="n">threads</span>
+<span class="n">lass</span> <span class="n">Store</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+ <span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+   <span class="k">pass</span>
+ <span class="k">def</span> <span class="nf">store</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">data</span><span class="p">:</span> <span class="nb">bytes</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+   <span class="k">pass</span>
+ <span class="k">def</span> <span class="nf">delete</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+   <span class="k">pass</span>
+<span class="n">ef</span> <span class="n">readFile</span><span class="p">(</span><span class="n">name</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+ <span class="k">print</span><span class="p">(</span><span class="s1">&#39;readFile&#39;</span><span class="p">)</span>
+ <span class="k">def</span> <span class="nf">inThread</span><span class="p">():</span>
+   <span class="k">print</span><span class="p">(</span><span class="s1">&#39;readFile &gt; inThread&#39;</span><span class="p">)</span>
+   <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="s1">&#39;r+b&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">fd</span><span class="p">:</span>
+     <span class="k">return</span> <span class="n">fd</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
+ <span class="k">return</span> <span class="n">threads</span><span class="o">.</span><span class="n">deferToThread</span><span class="p">(</span><span class="n">inThread</span><span class="p">)</span>
+<span class="n">ef</span> <span class="n">writeFile</span><span class="p">(</span><span class="n">name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">data</span><span class="p">:</span> <span class="nb">bytes</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+ <span class="k">print</span><span class="p">(</span><span class="s1">&#39;writeFile&#39;</span><span class="p">)</span>
+ <span class="k">def</span> <span class="nf">inThread</span><span class="p">():</span>
+   <span class="k">print</span><span class="p">(</span><span class="s1">&#39;writeFile &gt; inThread&#39;</span><span class="p">)</span>
+   <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="s1">&#39;w+b&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">fd</span><span class="p">:</span>
+     <span class="k">return</span> <span class="n">fd</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">threads</span><span class="o">.</span><span class="n">deferToThread</span><span class="p">(</span><span class="n">inThread</span><span class="p">)</span>
+<span class="n">lass</span> <span class="n">FileStore</span><span class="p">(</span><span class="n">Store</span><span class="p">):</span>
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+   <span class="bp">self</span><span class="o">.</span><span class="n">__name</span> <span class="o">=</span> <span class="n">name</span>
+   <span class="bp">self</span><span class="o">.</span><span class="n">__data</span> <span class="o">=</span> <span class="p">{}</span>
+   <span class="bp">self</span><span class="o">.</span><span class="n">__last</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__readData</span><span class="p">()</span>
+ <span class="nd">@defer.inlineCallbacks</span>
+ <span class="k">def</span> <span class="nf">__readData</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+   <span class="n">data</span> <span class="o">=</span> <span class="k">yield</span> <span class="n">readFile</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__name</span><span class="p">)</span>
+   <span class="n">data</span> <span class="o">=</span> <span class="n">msgpack</span><span class="o">.</span><span class="n">unpackb</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s1">&#39;utf-8&#39;</span><span class="p">)</span>
+   <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
+     <span class="bp">self</span><span class="o">.</span><span class="n">__data</span> <span class="o">=</span> <span class="n">data</span>
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+   <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__name</span>
+ <span class="k">def</span> <span class="nf">__queue</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">job</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+   <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">()</span>
+   <span class="k">def</span> <span class="nf">trampolineSucceed</span><span class="p">(</span><span class="n">result</span><span class="p">):</span>
+     <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">):</span>
+       <span class="n">result</span><span class="o">.</span><span class="n">addCallbacks</span><span class="p">(</span><span class="n">trampolineSucceed</span><span class="p">,</span> <span class="n">trampolineFail</span><span class="p">)</span>
+     <span class="k">else</span><span class="p">:</span>
+       <span class="n">d</span><span class="o">.</span><span class="n">callback</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
+   <span class="k">def</span> <span class="nf">trampolineFail</span><span class="p">(</span><span class="n">result</span><span class="p">):</span>
+     <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">):</span>
+       <span class="n">result</span><span class="o">.</span><span class="n">addCallbacks</span><span class="p">(</span><span class="n">trampolineSucceed</span><span class="p">,</span> <span class="n">trampolineFail</span><span class="p">)</span>
+     <span class="k">else</span><span class="p">:</span>
+       <span class="n">d</span><span class="o">.</span><span class="n">errback</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
+   <span class="bp">self</span><span class="o">.</span><span class="n">__last</span><span class="o">.</span><span class="n">addBoth</span><span class="p">(</span><span class="k">lambda</span> <span class="n">_</span><span class="p">:</span> <span class="n">job</span><span class="p">())</span>
+   <span class="bp">self</span><span class="o">.</span><span class="n">__last</span><span class="o">.</span><span class="n">addCallbacks</span><span class="p">(</span><span class="n">trampolineSucceed</span><span class="p">,</span> <span class="n">trampolineFail</span><span class="p">)</span>
+   <span class="k">return</span> <span class="n">d</span>
+ <span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+   <span class="k">def</span> <span class="nf">job</span><span class="p">():</span>
+     <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__data</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__data</span> <span class="k">else</span> <span class="bp">None</span>
+   <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__queue</span><span class="p">(</span><span class="n">job</span><span class="p">)</span>
+ <span class="k">def</span> <span class="nf">store</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+   <span class="k">def</span> <span class="nf">job</span><span class="p">():</span>
+     <span class="bp">self</span><span class="o">.</span><span class="n">__data</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">data</span>
+     <span class="k">return</span> <span class="n">writeFile</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__name</span><span class="p">,</span> <span class="n">msgpack</span><span class="o">.</span><span class="n">packb</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__data</span><span class="p">,</span> <span class="n">use_bin_type</span><span class="o">=</span><span class="bp">True</span><span class="p">))</span>
+   <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__queue</span><span class="p">(</span><span class="n">job</span><span class="p">)</span>
+ <span class="k">def</span> <span class="nf">delete</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+   <span class="k">def</span> <span class="nf">job</span><span class="p">():</span>
+     <span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__data</span><span class="p">:</span>
+       <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">__data</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
+       <span class="k">return</span> <span class="n">writeFile</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__name</span><span class="p">,</span> <span class="n">msgpack</span><span class="o">.</span><span class="n">packb</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__data</span><span class="p">,</span> <span class="n">use_bin_type</span><span class="o">=</span><span class="bp">True</span><span class="p">))</span>
+   <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__queue</span><span class="p">(</span><span class="n">job</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+
+  </header>
+
+  <section id="section-items">
+
+    <h2 class="section-title" id="header-functions">Functions</h2>
+      
+  <div class="item">
+    <div class="name def" id="supcon.store.readFile">
+    <p>def <span class="ident">readFile</span>(</p><p>name)</p>
+    </div>
+    
+
+    
+  
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.store.readFile', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.store.readFile" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">readFile</span><span class="p">(</span><span class="n">name</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+  <span class="k">print</span><span class="p">(</span><span class="s1">&#39;readFile&#39;</span><span class="p">)</span>
+  <span class="k">def</span> <span class="nf">inThread</span><span class="p">():</span>
+    <span class="k">print</span><span class="p">(</span><span class="s1">&#39;readFile &gt; inThread&#39;</span><span class="p">)</span>
+    <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="s1">&#39;r+b&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">fd</span><span class="p">:</span>
+      <span class="k">return</span> <span class="n">fd</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
+
+  <span class="k">return</span> <span class="n">threads</span><span class="o">.</span><span class="n">deferToThread</span><span class="p">(</span><span class="n">inThread</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+      
+  <div class="item">
+    <div class="name def" id="supcon.store.writeFile">
+    <p>def <span class="ident">writeFile</span>(</p><p>name, data)</p>
+    </div>
+    
+
+    
+  
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.store.writeFile', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.store.writeFile" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">writeFile</span><span class="p">(</span><span class="n">name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">data</span><span class="p">:</span> <span class="nb">bytes</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+  <span class="k">print</span><span class="p">(</span><span class="s1">&#39;writeFile&#39;</span><span class="p">)</span>
+  <span class="k">def</span> <span class="nf">inThread</span><span class="p">():</span>
+    <span class="k">print</span><span class="p">(</span><span class="s1">&#39;writeFile &gt; inThread&#39;</span><span class="p">)</span>
+    <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="s1">&#39;w+b&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">fd</span><span class="p">:</span>
+      <span class="k">return</span> <span class="n">fd</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
+
+  <span class="k">return</span> <span class="n">threads</span><span class="o">.</span><span class="n">deferToThread</span><span class="p">(</span><span class="n">inThread</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+
+    <h2 class="section-title" id="header-classes">Classes</h2>
+      
+      <div class="item">
+      <p id="supcon.store.FileStore" class="name">class <span class="ident">FileStore</span></p>
+      
+  
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.store.FileStore', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.store.FileStore" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">FileStore</span><span class="p">(</span><span class="n">Store</span><span class="p">):</span>
+
+  <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__name</span> <span class="o">=</span> <span class="n">name</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__data</span> <span class="o">=</span> <span class="p">{}</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__last</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__readData</span><span class="p">()</span>
+
+  <span class="nd">@defer.inlineCallbacks</span>
+  <span class="k">def</span> <span class="nf">__readData</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="n">data</span> <span class="o">=</span> <span class="k">yield</span> <span class="n">readFile</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__name</span><span class="p">)</span>
+    <span class="n">data</span> <span class="o">=</span> <span class="n">msgpack</span><span class="o">.</span><span class="n">unpackb</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s1">&#39;utf-8&#39;</span><span class="p">)</span>
+    <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__data</span> <span class="o">=</span> <span class="n">data</span>
+
+  <span class="nd">@property</span>
+  <span class="k">def</span> <span class="nf">name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__name</span>
+
+  <span class="k">def</span> <span class="nf">__queue</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">job</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+    <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">()</span>
+
+    <span class="k">def</span> <span class="nf">trampolineSucceed</span><span class="p">(</span><span class="n">result</span><span class="p">):</span>
+      <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">):</span>
+        <span class="n">result</span><span class="o">.</span><span class="n">addCallbacks</span><span class="p">(</span><span class="n">trampolineSucceed</span><span class="p">,</span> <span class="n">trampolineFail</span><span class="p">)</span>
+      <span class="k">else</span><span class="p">:</span>
+        <span class="n">d</span><span class="o">.</span><span class="n">callback</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
+
+    <span class="k">def</span> <span class="nf">trampolineFail</span><span class="p">(</span><span class="n">result</span><span class="p">):</span>
+      <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">):</span>
+        <span class="n">result</span><span class="o">.</span><span class="n">addCallbacks</span><span class="p">(</span><span class="n">trampolineSucceed</span><span class="p">,</span> <span class="n">trampolineFail</span><span class="p">)</span>
+      <span class="k">else</span><span class="p">:</span>
+        <span class="n">d</span><span class="o">.</span><span class="n">errback</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__last</span><span class="o">.</span><span class="n">addBoth</span><span class="p">(</span><span class="k">lambda</span> <span class="n">_</span><span class="p">:</span> <span class="n">job</span><span class="p">())</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__last</span><span class="o">.</span><span class="n">addCallbacks</span><span class="p">(</span><span class="n">trampolineSucceed</span><span class="p">,</span> <span class="n">trampolineFail</span><span class="p">)</span>
+
+    <span class="k">return</span> <span class="n">d</span>
+
+  <span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+    <span class="k">def</span> <span class="nf">job</span><span class="p">():</span>
+      <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__data</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__data</span> <span class="k">else</span> <span class="bp">None</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__queue</span><span class="p">(</span><span class="n">job</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">store</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+    <span class="k">def</span> <span class="nf">job</span><span class="p">():</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__data</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">data</span>
+      <span class="k">return</span> <span class="n">writeFile</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__name</span><span class="p">,</span> <span class="n">msgpack</span><span class="o">.</span><span class="n">packb</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__data</span><span class="p">,</span> <span class="n">use_bin_type</span><span class="o">=</span><span class="bp">True</span><span class="p">))</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__queue</span><span class="p">(</span><span class="n">job</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">delete</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+    <span class="k">def</span> <span class="nf">job</span><span class="p">():</span>
+      <span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__data</span><span class="p">:</span>
+        <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">__data</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
+        <span class="k">return</span> <span class="n">writeFile</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__name</span><span class="p">,</span> <span class="n">msgpack</span><span class="o">.</span><span class="n">packb</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__data</span><span class="p">,</span> <span class="n">use_bin_type</span><span class="o">=</span><span class="bp">True</span><span class="p">))</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__queue</span><span class="p">(</span><span class="n">job</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+
+      <div class="class">
+          <h3>Ancestors (in MRO)</h3>
+          <ul class="class_list">
+          <li><a href="/screwerk/supcon/store.m.md#supcon.store.FileStore">FileStore</a></li>
+          <li><a href="/screwerk/supcon/store.m.md#supcon.store.Store">Store</a></li>
+          <li>builtins.object</li>
+          </ul>
+          <h3>Instance variables</h3>
+            <div class="item">
+            <p id="supcon.store.FileStore.name" class="name">var <span class="ident">name</span></p>
+            
+
+            
+  
+  <div class="source_cont">
+</div>
+
+            </div>
+          <h3>Methods</h3>
+            
+  <div class="item">
+    <div class="name def" id="supcon.store.FileStore.__init__">
+    <p>def <span class="ident">__init__</span>(</p><p>self, name)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Initialize self.  See help(type(self)) for accurate signature.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.store.FileStore.__init__', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.store.FileStore.__init__" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__name</span> <span class="o">=</span> <span class="n">name</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__data</span> <span class="o">=</span> <span class="p">{}</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__last</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__readData</span><span class="p">()</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.store.FileStore.delete">
+    <p>def <span class="ident">delete</span>(</p><p>self, key)</p>
+    </div>
+    
+
+    
+  
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.store.FileStore.delete', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.store.FileStore.delete" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">delete</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+  <span class="k">def</span> <span class="nf">job</span><span class="p">():</span>
+    <span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__data</span><span class="p">:</span>
+      <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">__data</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
+      <span class="k">return</span> <span class="n">writeFile</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__name</span><span class="p">,</span> <span class="n">msgpack</span><span class="o">.</span><span class="n">packb</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__data</span><span class="p">,</span> <span class="n">use_bin_type</span><span class="o">=</span><span class="bp">True</span><span class="p">))</span>
+  <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__queue</span><span class="p">(</span><span class="n">job</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.store.FileStore.load">
+    <p>def <span class="ident">load</span>(</p><p>self, key)</p>
+    </div>
+    
+
+    
+  
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.store.FileStore.load', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.store.FileStore.load" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+  <span class="k">def</span> <span class="nf">job</span><span class="p">():</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__data</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__data</span> <span class="k">else</span> <span class="bp">None</span>
+  <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__queue</span><span class="p">(</span><span class="n">job</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.store.FileStore.store">
+    <p>def <span class="ident">store</span>(</p><p>self, key, data)</p>
+    </div>
+    
+
+    
+  
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.store.FileStore.store', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.store.FileStore.store" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">store</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+  <span class="k">def</span> <span class="nf">job</span><span class="p">():</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__data</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">data</span>
+    <span class="k">return</span> <span class="n">writeFile</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__name</span><span class="p">,</span> <span class="n">msgpack</span><span class="o">.</span><span class="n">packb</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__data</span><span class="p">,</span> <span class="n">use_bin_type</span><span class="o">=</span><span class="bp">True</span><span class="p">))</span>
+  <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__queue</span><span class="p">(</span><span class="n">job</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+      </div>
+      </div>
+      
+      <div class="item">
+      <p id="supcon.store.Store" class="name">class <span class="ident">Store</span></p>
+      
+  
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.store.Store', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.store.Store" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">Store</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+
+  <span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+    <span class="k">pass</span>
+
+  <span class="k">def</span> <span class="nf">store</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">data</span><span class="p">:</span> <span class="nb">bytes</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+    <span class="k">pass</span>
+
+  <span class="k">def</span> <span class="nf">delete</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+    <span class="k">pass</span>
+</pre></div>
+
+  </div>
+</div>
+
+
+      <div class="class">
+          <h3>Ancestors (in MRO)</h3>
+          <ul class="class_list">
+          <li><a href="/screwerk/supcon/store.m.md#supcon.store.Store">Store</a></li>
+          <li>builtins.object</li>
+          </ul>
+          <h3>Methods</h3>
+            
+  <div class="item">
+    <div class="name def" id="supcon.store.Store.delete">
+    <p>def <span class="ident">delete</span>(</p><p>self, key)</p>
+    </div>
+    
+
+    
+  
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.store.Store.delete', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.store.Store.delete" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">delete</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+  <span class="k">pass</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.store.Store.load">
+    <p>def <span class="ident">load</span>(</p><p>self, key)</p>
+    </div>
+    
+
+    
+  
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.store.Store.load', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.store.Store.load" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+  <span class="k">pass</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.store.Store.store">
+    <p>def <span class="ident">store</span>(</p><p>self, key, data)</p>
+    </div>
+    
+
+    
+  
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.store.Store.store', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.store.Store.store" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">store</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">data</span><span class="p">:</span> <span class="nb">bytes</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">:</span>
+  <span class="k">pass</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+      </div>
+      </div>
+
+  </section>
+
+    </article>
+</div>
diff --git a/doc/switch.m.md b/doc/switch.m.md
new file mode 100644 (file)
index 0000000..4edf50f
--- /dev/null
@@ -0,0 +1,1491 @@
+<link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,300' rel='stylesheet' type='text/css'>
+
+
+<style type="text/css">
+
+  .CONTENT {
+    padding: 0;
+  }
+
+  #container {
+    display: flex;
+    flex-directtion: column;
+  }
+
+  #content {
+    padding: 30px;
+    border-left: 1px solid #ddd;
+  }
+  #sidebar {
+    padding: 30px;
+  }
+
+  #footer {
+    font-size: .75em;
+    padding: 5px 30px;
+    border-top: 1px solid #ddd;
+    text-align: right;
+  }
+  #footer p {
+    margin: 0 0 0 30px;
+    display: inline-block;
+  }
+
+  h1, h2, h3, h4, h5 {
+    font-weight: 300;
+  }
+  h1 {
+    font-size: 2.5em;
+    line-height: 1.1em;
+    margin: 0 0 .50em 0;
+  }
+
+  h2 {
+    font-size: 1.75em;
+    margin: 1em 0 .50em 0;
+  }
+
+  h3 {
+    margin: 25px 0 10px 0;
+  }
+
+  h4 {
+    margin: 0;
+    font-size: 105%;
+  }
+
+  a {
+    color: #058;
+    text-decoration: none;
+    transition: color .3s ease-in-out;
+  }
+
+  a:hover {
+    color: #e08524;
+    transition: color .3s ease-in-out;
+  }
+
+  pre, code, .mono, .name {
+    font-family: "Ubuntu Mono", "Cousine", "DejaVu Sans Mono", monospace;
+  }
+
+  .title .name {
+    font-weight: bold;
+  }
+  .section-title {
+    margin-top: 2em;
+  }
+  .ident {
+    color: #900;
+  }
+
+  code {
+    background: #f9f9f9;
+  } 
+
+  pre {
+    background: #fefefe;
+    border: 1px solid #ddd;
+    box-shadow: 2px 2px 0 #f3f3f3;
+    margin: 0 30px;
+    padding: 15px 30px;
+  }
+
+  .codehilite {
+    margin: 0 30px 10px 30px;
+  }
+
+    .codehilite pre {
+      margin: 0;
+    }
+    .codehilite .err { background: #ff3300; color: #fff !important; } 
+
+  table#module-list {
+    font-size: 110%;
+  }
+
+    table#module-list tr td:first-child {
+      padding-right: 10px;
+      white-space: nowrap;
+    }
+
+    table#module-list td {
+      vertical-align: top;
+      padding-bottom: 8px;
+    }
+
+      table#module-list td p {
+        margin: 0 0 7px 0;
+      }
+
+  .def {
+    display: table;
+  }
+
+    .def p {
+      display: table-cell;
+      vertical-align: top;
+      text-align: left;
+    }
+
+    .def p:first-child {
+      white-space: nowrap;
+    }
+
+    .def p:last-child {
+      width: 100%;
+    }
+
+
+  #index {
+    list-style-type: none;
+    margin: 0;
+    padding: 0;
+  }
+    ul#index .class_name {
+      /* font-size: 110%; */
+      font-weight: bold;
+    }
+    #index ul {
+      margin: 0;
+    }
+
+  .item {
+    margin: 0 0 15px 0;
+  }
+
+    .item .class {
+      margin: 0 0 25px 30px;
+    }
+
+      .item .class ul.class_list {
+        margin: 0 0 20px 0;
+      }
+
+    .item .name {
+      background: #fafafa;
+      margin: 0;
+      font-weight: bold;
+      padding: 5px 10px;
+      border-radius: 3px;
+      display: inline-block;
+      min-width: 40%;
+    }
+      .item .name:hover {
+        background: #f6f6f6;
+      }
+
+    .item .empty_desc {
+      margin: 0 0 5px 0;
+      padding: 0;
+    }
+
+    .item .inheritance {
+      margin: 3px 0 0 30px;
+    }
+
+    .item .inherited {
+      color: #666;
+    }
+
+    .item .desc {
+      padding: 0 8px;
+      margin: 0;
+    }
+
+      .item .desc p {
+        margin: 0 0 10px 0;
+      }
+
+    .source_cont {
+      margin: 0;
+      padding: 0;
+    }
+
+    .source_link a {
+      background: #ffc300;
+      font-weight: 400;
+      font-size: .75em;
+      text-transform: uppercase;
+      color: #fff;
+      text-shadow: 1px 1px 0 #f4b700;
+      
+      padding: 3px 8px;
+      border-radius: 2px;
+      transition: background .3s ease-in-out;
+    }
+      .source_link a:hover {
+        background: #FF7200;
+        text-shadow: none;
+        transition: background .3s ease-in-out;
+      }
+
+    .source {
+      display: none;
+      max-height: 600px;
+      overflow-y: scroll;
+      margin-bottom: 15px;
+    }
+
+      .source .codehilite {
+        margin: 0;
+      }
+
+  .desc h1, .desc h2, .desc h3 {
+    font-size: 100% !important;
+  }
+  .clear {
+    clear: both;
+  }
+
+  @media all and (max-width: 950px) {
+    #sidebar {
+      width: 35%;
+    }
+    #content {
+      width: 65%;
+    }
+  }
+  @media all and (max-width: 650px) {
+    #top {
+      display: none;
+    }
+    #sidebar {
+      float: none;
+      width: auto;
+    }
+    #content {
+      float: none;
+      width: auto;
+      padding: 30px;
+    }
+
+    #index ul {
+      padding: 0;
+      margin-bottom: 15px;
+    }
+    #index ul li {
+      display: inline-block;
+      margin-right: 30px;
+    }
+    #footer {
+      text-align: left;
+    }
+    #footer p {
+      display: block;
+      margin: inherit;
+    }
+  }
+
+  /*****************************/
+
+</style>
+
+<style type="text/css">
+.codehilite .hll { background-color: #ffffcc }
+.codehilite  { background: #f8f8f8; }
+.codehilite .c { color: #408080; font-style: italic } /* Comment */
+.codehilite .err { border: 1px solid #FF0000 } /* Error */
+.codehilite .k { color: #008000; font-weight: bold } /* Keyword */
+.codehilite .o { color: #666666 } /* Operator */
+.codehilite .ch { color: #408080; font-style: italic } /* Comment.Hashbang */
+.codehilite .cm { color: #408080; font-style: italic } /* Comment.Multiline */
+.codehilite .cp { color: #BC7A00 } /* Comment.Preproc */
+.codehilite .cpf { color: #408080; font-style: italic } /* Comment.PreprocFile */
+.codehilite .c1 { color: #408080; font-style: italic } /* Comment.Single */
+.codehilite .cs { color: #408080; font-style: italic } /* Comment.Special */
+.codehilite .gd { color: #A00000 } /* Generic.Deleted */
+.codehilite .ge { font-style: italic } /* Generic.Emph */
+.codehilite .gr { color: #FF0000 } /* Generic.Error */
+.codehilite .gh { color: #000080; font-weight: bold } /* Generic.Heading */
+.codehilite .gi { color: #00A000 } /* Generic.Inserted */
+.codehilite .go { color: #888888 } /* Generic.Output */
+.codehilite .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
+.codehilite .gs { font-weight: bold } /* Generic.Strong */
+.codehilite .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
+.codehilite .gt { color: #0044DD } /* Generic.Traceback */
+.codehilite .kc { color: #008000; font-weight: bold } /* Keyword.Constant */
+.codehilite .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
+.codehilite .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
+.codehilite .kp { color: #008000 } /* Keyword.Pseudo */
+.codehilite .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
+.codehilite .kt { color: #B00040 } /* Keyword.Type */
+.codehilite .m { color: #666666 } /* Literal.Number */
+.codehilite .s { color: #BA2121 } /* Literal.String */
+.codehilite .na { color: #7D9029 } /* Name.Attribute */
+.codehilite .nb { color: #008000 } /* Name.Builtin */
+.codehilite .nc { color: #0000FF; font-weight: bold } /* Name.Class */
+.codehilite .no { color: #880000 } /* Name.Constant */
+.codehilite .nd { color: #AA22FF } /* Name.Decorator */
+.codehilite .ni { color: #999999; font-weight: bold } /* Name.Entity */
+.codehilite .ne { color: #D2413A; font-weight: bold } /* Name.Exception */
+.codehilite .nf { color: #0000FF } /* Name.Function */
+.codehilite .nl { color: #A0A000 } /* Name.Label */
+.codehilite .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
+.codehilite .nt { color: #008000; font-weight: bold } /* Name.Tag */
+.codehilite .nv { color: #19177C } /* Name.Variable */
+.codehilite .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
+.codehilite .w { color: #bbbbbb } /* Text.Whitespace */
+.codehilite .mb { color: #666666 } /* Literal.Number.Bin */
+.codehilite .mf { color: #666666 } /* Literal.Number.Float */
+.codehilite .mh { color: #666666 } /* Literal.Number.Hex */
+.codehilite .mi { color: #666666 } /* Literal.Number.Integer */
+.codehilite .mo { color: #666666 } /* Literal.Number.Oct */
+.codehilite .sa { color: #BA2121 } /* Literal.String.Affix */
+.codehilite .sb { color: #BA2121 } /* Literal.String.Backtick */
+.codehilite .sc { color: #BA2121 } /* Literal.String.Char */
+.codehilite .dl { color: #BA2121 } /* Literal.String.Delimiter */
+.codehilite .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
+.codehilite .s2 { color: #BA2121 } /* Literal.String.Double */
+.codehilite .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */
+.codehilite .sh { color: #BA2121 } /* Literal.String.Heredoc */
+.codehilite .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */
+.codehilite .sx { color: #008000 } /* Literal.String.Other */
+.codehilite .sr { color: #BB6688 } /* Literal.String.Regex */
+.codehilite .s1 { color: #BA2121 } /* Literal.String.Single */
+.codehilite .ss { color: #19177C } /* Literal.String.Symbol */
+.codehilite .bp { color: #008000 } /* Name.Builtin.Pseudo */
+.codehilite .fm { color: #0000FF } /* Name.Function.Magic */
+.codehilite .vc { color: #19177C } /* Name.Variable.Class */
+.codehilite .vg { color: #19177C } /* Name.Variable.Global */
+.codehilite .vi { color: #19177C } /* Name.Variable.Instance */
+.codehilite .vm { color: #19177C } /* Name.Variable.Magic */
+.codehilite .il { color: #666666 } /* Literal.Number.Integer.Long */
+</style>
+
+<script type="text/javascript">
+function toggle(id, $link) {
+  $node = document.getElementById(id);
+  if (!$node) return;
+  if (!$node.style.display || $node.style.display == 'none') {
+    $node.style.display = 'block';
+    $link.innerHTML = 'Hide source &nequiv;';
+  } else {
+    $node.style.display = 'none';
+    $link.innerHTML = 'Show source &equiv;';
+  }
+}
+</script>
+
+<div id="container">
+    
+  
+  <div id="sidebar">
+    <a href="/screwerk/supcon">Doc</a>
+
+    <h1>Index</h1>
+    <ul id="index">
+    <li class="set"><h3><a href="/screwerk/supcon/switch.m.md#header-variables">Module variables</a></h3>
+      
+  <ul>
+    <li class="mono"><a href="/screwerk/supcon/switch.m.md#supcon.switch.SensorIntf">SensorIntf</a></li>
+    <li class="mono"><a href="/screwerk/supcon/switch.m.md#supcon.switch.SwitchIntf">SwitchIntf</a></li>
+  </ul>
+
+    </li>
+
+    <li class="set"><h3><a href="/screwerk/supcon/switch.m.md#header-functions">Functions</a></h3>
+      
+  <ul>
+    <li class="mono"><a href="/screwerk/supcon/switch.m.md#supcon.switch.returnFirst">returnFirst</a></li>
+    <li class="mono"><a href="/screwerk/supcon/switch.m.md#supcon.switch.returnNone">returnNone</a></li>
+    <li class="mono"><a href="/screwerk/supcon/switch.m.md#supcon.switch.returnTrue">returnTrue</a></li>
+  </ul>
+
+    </li>
+
+    <li class="set"><h3><a href="/screwerk/supcon/switch.m.md#header-classes">Classes</a></h3>
+      <ul>
+        <li class="mono">
+        <span class="class_name"><a href="/screwerk/supcon/switch.m.md#supcon.switch.NodeSensor">NodeSensor</a></span>
+        
+          
+  <ul>
+    <li class="mono"><a href="/screwerk/supcon/switch.m.md#supcon.switch.NodeSensor.__init__">__init__</a></li>
+    <li class="mono"><a href="/screwerk/supcon/switch.m.md#supcon.switch.NodeSensor.emit">emit</a></li>
+    <li class="mono"><a href="/screwerk/supcon/switch.m.md#supcon.switch.NodeSensor.off">off</a></li>
+    <li class="mono"><a href="/screwerk/supcon/switch.m.md#supcon.switch.NodeSensor.on">on</a></li>
+  </ul>
+
+        </li>
+        <li class="mono">
+        <span class="class_name"><a href="/screwerk/supcon/switch.m.md#supcon.switch.PiGPIOSensor">PiGPIOSensor</a></span>
+        
+          
+  <ul>
+    <li class="mono"><a href="/screwerk/supcon/switch.m.md#supcon.switch.PiGPIOSensor.__init__">__init__</a></li>
+  </ul>
+
+        </li>
+        <li class="mono">
+        <span class="class_name"><a href="/screwerk/supcon/switch.m.md#supcon.switch.PiGPIOSwitch">PiGPIOSwitch</a></span>
+        
+          
+  <ul>
+    <li class="mono"><a href="/screwerk/supcon/switch.m.md#supcon.switch.PiGPIOSwitch.__init__">__init__</a></li>
+    <li class="mono"><a href="/screwerk/supcon/switch.m.md#supcon.switch.PiGPIOSwitch.update">update</a></li>
+  </ul>
+
+        </li>
+        <li class="mono">
+        <span class="class_name"><a href="/screwerk/supcon/switch.m.md#supcon.switch.SoftSensor">SoftSensor</a></span>
+        
+          
+  <ul>
+    <li class="mono"><a href="/screwerk/supcon/switch.m.md#supcon.switch.SoftSensor.__init__">__init__</a></li>
+    <li class="mono"><a href="/screwerk/supcon/switch.m.md#supcon.switch.SoftSensor.update">update</a></li>
+  </ul>
+
+        </li>
+        <li class="mono">
+        <span class="class_name"><a href="/screwerk/supcon/switch.m.md#supcon.switch.SoftSwitch">SoftSwitch</a></span>
+        
+          
+  <ul>
+    <li class="mono"><a href="/screwerk/supcon/switch.m.md#supcon.switch.SoftSwitch.__init__">__init__</a></li>
+    <li class="mono"><a href="/screwerk/supcon/switch.m.md#supcon.switch.SoftSwitch.update">update</a></li>
+  </ul>
+
+        </li>
+      </ul>
+    </li>
+
+    </ul>
+  </div>
+
+    <article id="content">
+      
+  
+
+  
+
+
+  <header id="section-intro">
+  <h1 class="title"><span class="name">supcon.switch</span> module</h1>
+  
+  
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.switch', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.switch" class="source">
+    <div class="codehilite"><pre><span></span><span class="c1"># -*- coding: utf-8 -*-</span>
+
+<span class="kn">import</span> <span class="nn">pigpio</span>
+<span class="kn">import</span> <span class="nn">supcon.util</span>
+<span class="kn">import</span> <span class="nn">supcon.intf</span>
+
+<span class="sd">&quot;&quot;&quot; the interface com.screwerk.Sensor &quot;&quot;&quot;</span>
+<span class="n">SensorIntf</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">DInterface</span><span class="o">.</span><span class="n">load</span><span class="p">({</span>
+  <span class="s1">&#39;name&#39;</span><span class="p">:</span>
+  <span class="s1">&#39;com.screwerk.Sensor&#39;</span><span class="p">,</span>
+  <span class="s1">&#39;events&#39;</span><span class="p">:</span> <span class="p">[{</span>
+    <span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="s1">&#39;changed&#39;</span><span class="p">,</span>
+    <span class="s1">&#39;args&#39;</span><span class="p">:</span> <span class="p">[</span>
+      <span class="p">{</span>
+        <span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="s1">&#39;value&#39;</span><span class="p">,</span> <span class="s1">&#39;description&#39;</span><span class="p">:</span> <span class="s1">&#39;The new sensor value&#39;</span>
+      <span class="p">}</span>
+    <span class="p">],</span>
+    <span class="s1">&#39;description&#39;</span><span class="p">:</span> <span class="s1">&#39;Fires when the sensor value changes&#39;</span>
+  <span class="p">}],</span>
+  <span class="s1">&#39;methods&#39;</span><span class="p">:</span> <span class="p">[{</span>
+    <span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="s1">&#39;value&#39;</span><span class="p">,</span>
+    <span class="s1">&#39;outArgs&#39;</span><span class="p">:</span> <span class="p">[</span>
+      <span class="p">{</span>
+        <span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="s1">&#39;value&#39;</span><span class="p">,</span> <span class="s1">&#39;description&#39;</span><span class="p">:</span> <span class="s1">&#39;The sensor value&#39;</span>
+      <span class="p">}</span>
+    <span class="p">],</span>
+    <span class="s1">&#39;description&#39;</span><span class="p">:</span> <span class="s1">&#39;Returns the sensor value&#39;</span>
+  <span class="p">}]</span>
+<span class="p">})</span>
+
+<span class="sd">&quot;&quot;&quot; the interface com.screwerk.Switch &quot;&quot;&quot;</span>
+<span class="n">SwitchIntf</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">DInterface</span><span class="o">.</span><span class="n">load</span><span class="p">({</span>
+  <span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="s1">&#39;com.screwerk.Switch&#39;</span><span class="p">,</span>
+  <span class="s1">&#39;methods&#39;</span><span class="p">:</span> <span class="p">[</span>
+    <span class="p">{</span>
+      <span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="s1">&#39;on&#39;</span><span class="p">,</span> <span class="s1">&#39;description&#39;</span><span class="p">:</span> <span class="s1">&#39;Toggles the switch on&#39;</span>
+    <span class="p">},</span> <span class="p">{</span>
+      <span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="s1">&#39;off&#39;</span><span class="p">,</span> <span class="s1">&#39;description&#39;</span><span class="p">:</span> <span class="s1">&#39;Toggles the switch off&#39;</span>
+    <span class="p">},</span> <span class="p">{</span>
+      <span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="s1">&#39;toggle&#39;</span><span class="p">,</span> <span class="s1">&#39;description&#39;</span><span class="p">:</span> <span class="s1">&#39;Toggles the switch&#39;</span>
+    <span class="p">}</span>
+  <span class="p">]</span>
+<span class="p">})</span>
+
+
+<span class="k">def</span> <span class="nf">returnTrue</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">):</span> <span class="k">return</span> <span class="bp">True</span>
+<span class="k">def</span> <span class="nf">returnNone</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">):</span> <span class="k">return</span> <span class="bp">None</span>
+<span class="k">def</span> <span class="nf">returnFirst</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">):</span> <span class="k">return</span> <span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
+
+
+<span class="k">class</span> <span class="nc">SoftSensor</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+  <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">guard</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">effect</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">convert</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__guard</span> <span class="o">=</span> <span class="n">guard</span> <span class="ow">or</span> <span class="n">returnTrue</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__effect</span> <span class="o">=</span> <span class="n">effect</span> <span class="ow">or</span> <span class="n">returnNone</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__convert</span> <span class="o">=</span> <span class="n">convert</span> <span class="ow">or</span> <span class="n">returnFirst</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__convert</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__sensor</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">Implementation</span><span class="p">(</span><span class="n">SensorIntf</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__sensor</span><span class="o">.</span><span class="n">setCallCb</span><span class="p">(</span><span class="s1">&#39;value&#39;</span><span class="p">,</span> <span class="k">lambda</span><span class="p">:</span> <span class="p">{</span><span class="s1">&#39;value&#39;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__value</span><span class="p">})</span>
+
+  <span class="nd">@property</span>
+  <span class="k">def</span> <span class="nf">value</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__value</span>
+
+  <span class="nd">@property</span>
+  <span class="k">def</span> <span class="nf">sensor</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__sensor</span>
+
+  <span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
+    <span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__convert</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+    <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__value</span> <span class="o">==</span> <span class="n">value</span><span class="p">:</span>
+      <span class="k">return</span> <span class="bp">False</span>
+    <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">__guard</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">self</span><span class="p">):</span>
+      <span class="k">return</span> <span class="bp">False</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__value</span> <span class="o">=</span> <span class="n">value</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__effect</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__sensor</span><span class="o">.</span><span class="n">fire</span><span class="p">(</span><span class="s1">&#39;changed&#39;</span><span class="p">,</span> <span class="p">{</span><span class="s1">&#39;value&#39;</span><span class="p">:</span> <span class="n">value</span><span class="p">})</span>
+    <span class="k">return</span> <span class="bp">True</span>
+
+
+<span class="k">class</span> <span class="nc">SoftSwitch</span><span class="p">(</span><span class="n">SoftSensor</span><span class="p">):</span>
+  <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span> <span class="n">guard</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">effect</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">convert</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+    <span class="n">boolConvert</span> <span class="o">=</span> <span class="p">(</span><span class="k">lambda</span> <span class="n">value</span><span class="p">:</span> <span class="nb">bool</span><span class="p">(</span><span class="n">convert</span><span class="p">(</span><span class="n">value</span><span class="p">)))</span> <span class="k">if</span> <span class="n">convert</span> <span class="k">else</span> <span class="nb">bool</span>
+    <span class="n">SoftSensor</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">guard</span><span class="p">,</span> <span class="n">effect</span><span class="p">,</span> <span class="n">boolConvert</span><span class="p">)</span>
+
+    <span class="n">update</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">value</span><span class="p">:</span> <span class="p">{}</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> <span class="k">else</span> <span class="p">{}</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__switch</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">Implementation</span><span class="p">(</span><span class="n">SwitchIntf</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__switch</span><span class="o">.</span><span class="n">setCallCb</span><span class="p">(</span><span class="s1">&#39;on&#39;</span><span class="p">,</span> <span class="k">lambda</span><span class="p">:</span> <span class="n">update</span><span class="p">(</span><span class="bp">True</span><span class="p">))</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__switch</span><span class="o">.</span><span class="n">setCallCb</span><span class="p">(</span><span class="s1">&#39;off&#39;</span><span class="p">,</span> <span class="k">lambda</span><span class="p">:</span> <span class="n">update</span><span class="p">(</span><span class="bp">False</span><span class="p">))</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__switch</span><span class="o">.</span><span class="n">setCallCb</span><span class="p">(</span><span class="s1">&#39;toggle&#39;</span><span class="p">,</span> <span class="k">lambda</span><span class="p">:</span> <span class="n">update</span><span class="p">(</span><span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">value</span><span class="p">))</span>
+
+  <span class="nd">@property</span>
+  <span class="k">def</span> <span class="nf">switch</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__switch</span>
+
+
+<span class="k">class</span> <span class="nc">PiGPIOSensor</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+  <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">reactor</span><span class="p">,</span> <span class="n">gpio</span><span class="p">):</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__reactor</span> <span class="o">=</span> <span class="n">reactor</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span> <span class="o">=</span> <span class="n">gpio</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__pi</span> <span class="o">=</span> <span class="n">pigpio</span><span class="o">.</span><span class="n">pi</span><span class="p">()</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__pi</span><span class="o">.</span><span class="n">set_mode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span><span class="p">,</span> <span class="n">pigpio</span><span class="o">.</span><span class="n">INPUT</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__pi</span><span class="o">.</span><span class="n">set_glitch_filter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span><span class="p">,</span> <span class="mi">50000</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__pi</span><span class="o">.</span><span class="n">set_pull_up_down</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span><span class="p">,</span> <span class="n">pigpio</span><span class="o">.</span><span class="n">PUD_UP</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__pi</span><span class="o">.</span><span class="n">callback</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span><span class="p">,</span> <span class="n">pigpio</span><span class="o">.</span><span class="n">EITHER_EDGE</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callback</span><span class="p">)</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__value</span> <span class="o">=</span> <span class="nb">bool</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__pi</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span><span class="p">))</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__sensor</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">Implementation</span><span class="p">(</span><span class="n">SensorIntf</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__sensor</span><span class="o">.</span><span class="n">setCallCb</span><span class="p">(</span><span class="s1">&#39;value&#39;</span><span class="p">,</span> <span class="k">lambda</span><span class="p">:</span> <span class="p">{</span><span class="s1">&#39;value&#39;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__value</span><span class="p">})</span>
+
+  <span class="nd">@property</span>
+  <span class="k">def</span> <span class="nf">sensor</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__sensor</span>
+
+  <span class="k">def</span> <span class="nf">__callback</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">gpio</span><span class="p">,</span> <span class="n">level</span><span class="p">,</span> <span class="n">tick</span><span class="p">):</span>
+    <span class="k">if</span> <span class="n">level</span> <span class="o">&gt;=</span> <span class="mi">2</span><span class="p">:</span>
+      <span class="k">return</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__reactor</span><span class="o">.</span><span class="n">callFromThread</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__update</span><span class="p">,</span> <span class="nb">bool</span><span class="p">(</span><span class="n">level</span><span class="p">))</span>
+
+  <span class="k">def</span> <span class="nf">__update</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
+    <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__value</span> <span class="o">==</span> <span class="nb">bool</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
+      <span class="k">return</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__value</span> <span class="o">=</span> <span class="nb">bool</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__sensor</span><span class="o">.</span><span class="n">fire</span><span class="p">(</span><span class="s1">&#39;changed&#39;</span><span class="p">,</span> <span class="p">{</span><span class="s1">&#39;value&#39;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__value</span><span class="p">})</span>
+
+
+<span class="k">class</span> <span class="nc">PiGPIOSwitch</span><span class="p">(</span><span class="n">SoftSwitch</span><span class="p">):</span>
+  <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">gpio</span><span class="p">,</span> <span class="n">guard</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">effect</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">convert</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span> <span class="o">=</span> <span class="n">gpio</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__pi</span> <span class="o">=</span> <span class="n">pigpio</span><span class="o">.</span><span class="n">pi</span><span class="p">()</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__pi</span><span class="o">.</span><span class="n">set_mode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span><span class="p">,</span> <span class="n">pigpio</span><span class="o">.</span><span class="n">OUTPUT</span><span class="p">)</span>
+
+    <span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__pi</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span><span class="p">)</span>
+
+    <span class="k">def</span> <span class="nf">writeEffect</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">switch</span><span class="p">):</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__pi</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">value</span><span class="p">))</span>
+      <span class="k">if</span> <span class="nb">callable</span><span class="p">(</span><span class="n">effect</span><span class="p">):</span>
+        <span class="n">effect</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">switch</span><span class="p">)</span>
+
+    <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">guard</span><span class="p">,</span> <span class="n">writeEffect</span><span class="p">,</span> <span class="n">convert</span><span class="p">)</span>
+
+
+<span class="k">class</span> <span class="nc">NodeSensor</span><span class="p">(</span><span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">EventEmitter</span><span class="p">):</span>
+
+  <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">local</span><span class="p">:</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">Node</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
+    <span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">EventEmitter</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__local</span> <span class="o">=</span> <span class="n">local</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__node</span> <span class="o">=</span> <span class="n">node</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__path</span> <span class="o">=</span> <span class="n">path</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__value</span> <span class="o">=</span> <span class="bp">None</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">on</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;supcon.Local&#39;</span><span class="p">,</span> <span class="s1">&#39;intf&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__onIntf</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">on</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;supcon.Local&#39;</span><span class="p">,</span> <span class="s1">&#39;intfLost&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__onIntfLost</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">on</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">node</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">path</span><span class="p">,</span> <span class="s1">&#39;com.screwerk.Sensor&#39;</span><span class="p">,</span> <span class="s1">&#39;changed&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__onChanged</span><span class="p">)</span>
+
+    <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">nodes</span><span class="p">()</span><span class="o">.</span><span class="n">hasIntf</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">node</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">path</span><span class="p">,</span> <span class="s1">&#39;com.screwerk.com&#39;</span><span class="p">):</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__fetchValue</span><span class="p">()</span>
+
+  <span class="k">def</span> <span class="fm">__del__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">off</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;supcon.Local&#39;</span><span class="p">,</span> <span class="s1">&#39;intf&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__onIntf</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">off</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;supcon.Local&#39;</span><span class="p">,</span> <span class="s1">&#39;intfLost&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__onIntfLost</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">off</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">node</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">path</span><span class="p">,</span> <span class="s1">&#39;com.screwerk.Sensor&#39;</span><span class="p">,</span> <span class="s1">&#39;changed&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__onChanged</span><span class="p">)</span>
+
+  <span class="nd">@property</span>
+  <span class="k">def</span> <span class="nf">node</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__node</span>
+
+  <span class="nd">@property</span>
+  <span class="k">def</span> <span class="nf">path</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__path</span>
+
+  <span class="nd">@property</span>
+  <span class="k">def</span> <span class="nf">value</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__value</span>
+
+  <span class="k">def</span> <span class="nf">__fetchValue</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">node</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">path</span><span class="p">,</span> <span class="s1">&#39;com.screwerk.Sensor&#39;</span><span class="p">,</span> <span class="s1">&#39;value&#39;</span><span class="p">,</span> <span class="p">{})</span><span class="o">.</span><span class="n">addCallbacks</span><span class="p">(</span>
+      <span class="k">lambda</span> <span class="n">args</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__update</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="s1">&#39;value&#39;</span><span class="p">]),</span>
+      <span class="k">lambda</span> <span class="n">reason</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__update</span><span class="p">(</span><span class="bp">None</span><span class="p">)</span>
+    <span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">__update</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
+    <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__value</span> <span class="o">==</span> <span class="n">value</span><span class="p">:</span>
+      <span class="k">return</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__value</span> <span class="o">=</span> <span class="n">value</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">emit</span><span class="p">(</span><span class="s1">&#39;changed&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__value</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">__onIntf</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
+    <span class="k">if</span> <span class="p">(</span><span class="n">args</span><span class="o">.</span><span class="n">node</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">node</span> <span class="ow">and</span> <span class="n">args</span><span class="o">.</span><span class="n">path</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">path</span> <span class="ow">and</span> <span class="n">args</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s1">&#39;com.screwerk.Sensor&#39;</span><span class="p">):</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__fetchValue</span><span class="p">()</span>
+
+  <span class="k">def</span> <span class="nf">__onIntfLost</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
+    <span class="k">if</span> <span class="p">(</span><span class="n">args</span><span class="o">.</span><span class="n">node</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">node</span> <span class="ow">and</span> <span class="n">args</span><span class="o">.</span><span class="n">path</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">path</span> <span class="ow">and</span> <span class="n">args</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s1">&#39;com.screwerk.Sensor&#39;</span><span class="p">):</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__update</span><span class="p">(</span><span class="bp">None</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">__onChanged</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
+       <span class="bp">self</span><span class="o">.</span><span class="n">__update</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="s1">&#39;value&#39;</span><span class="p">])</span>
+</pre></div>
+
+  </div>
+
+  </header>
+
+  <section id="section-items">
+    <h2 class="section-title" id="header-variables">Module variables</h2>
+      <div class="item">
+      <p id="supcon.switch.SensorIntf" class="name">var <span class="ident">SensorIntf</span></p>
+      
+  
+    <div class="desc"><p>the interface com.screwerk.Switch</p></div>
+  <div class="source_cont">
+</div>
+
+      </div>
+      <div class="item">
+      <p id="supcon.switch.SwitchIntf" class="name">var <span class="ident">SwitchIntf</span></p>
+      
+  
+  <div class="source_cont">
+</div>
+
+      </div>
+
+    <h2 class="section-title" id="header-functions">Functions</h2>
+      
+  <div class="item">
+    <div class="name def" id="supcon.switch.returnFirst">
+    <p>def <span class="ident">returnFirst</span>(</p><p>*args)</p>
+    </div>
+    
+
+    
+  
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.switch.returnFirst', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.switch.returnFirst" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">returnFirst</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">):</span> <span class="k">return</span> <span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+      
+  <div class="item">
+    <div class="name def" id="supcon.switch.returnNone">
+    <p>def <span class="ident">returnNone</span>(</p><p>*args)</p>
+    </div>
+    
+
+    
+  
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.switch.returnNone', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.switch.returnNone" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">returnNone</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">):</span> <span class="k">return</span> <span class="bp">None</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+      
+  <div class="item">
+    <div class="name def" id="supcon.switch.returnTrue">
+    <p>def <span class="ident">returnTrue</span>(</p><p>*args)</p>
+    </div>
+    
+
+    
+  
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.switch.returnTrue', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.switch.returnTrue" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">returnTrue</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">):</span> <span class="k">return</span> <span class="bp">True</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+
+    <h2 class="section-title" id="header-classes">Classes</h2>
+      
+      <div class="item">
+      <p id="supcon.switch.NodeSensor" class="name">class <span class="ident">NodeSensor</span></p>
+      
+  
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.switch.NodeSensor', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.switch.NodeSensor" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">NodeSensor</span><span class="p">(</span><span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">EventEmitter</span><span class="p">):</span>
+
+  <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">local</span><span class="p">:</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">Node</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
+    <span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">EventEmitter</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__local</span> <span class="o">=</span> <span class="n">local</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__node</span> <span class="o">=</span> <span class="n">node</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__path</span> <span class="o">=</span> <span class="n">path</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__value</span> <span class="o">=</span> <span class="bp">None</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">on</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;supcon.Local&#39;</span><span class="p">,</span> <span class="s1">&#39;intf&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__onIntf</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">on</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;supcon.Local&#39;</span><span class="p">,</span> <span class="s1">&#39;intfLost&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__onIntfLost</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">on</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">node</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">path</span><span class="p">,</span> <span class="s1">&#39;com.screwerk.Sensor&#39;</span><span class="p">,</span> <span class="s1">&#39;changed&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__onChanged</span><span class="p">)</span>
+
+    <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">nodes</span><span class="p">()</span><span class="o">.</span><span class="n">hasIntf</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">node</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">path</span><span class="p">,</span> <span class="s1">&#39;com.screwerk.com&#39;</span><span class="p">):</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__fetchValue</span><span class="p">()</span>
+
+  <span class="k">def</span> <span class="fm">__del__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">off</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;supcon.Local&#39;</span><span class="p">,</span> <span class="s1">&#39;intf&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__onIntf</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">off</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;supcon.Local&#39;</span><span class="p">,</span> <span class="s1">&#39;intfLost&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__onIntfLost</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">off</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">node</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">path</span><span class="p">,</span> <span class="s1">&#39;com.screwerk.Sensor&#39;</span><span class="p">,</span> <span class="s1">&#39;changed&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__onChanged</span><span class="p">)</span>
+
+  <span class="nd">@property</span>
+  <span class="k">def</span> <span class="nf">node</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__node</span>
+
+  <span class="nd">@property</span>
+  <span class="k">def</span> <span class="nf">path</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__path</span>
+
+  <span class="nd">@property</span>
+  <span class="k">def</span> <span class="nf">value</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__value</span>
+
+  <span class="k">def</span> <span class="nf">__fetchValue</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">node</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">path</span><span class="p">,</span> <span class="s1">&#39;com.screwerk.Sensor&#39;</span><span class="p">,</span> <span class="s1">&#39;value&#39;</span><span class="p">,</span> <span class="p">{})</span><span class="o">.</span><span class="n">addCallbacks</span><span class="p">(</span>
+      <span class="k">lambda</span> <span class="n">args</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__update</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="s1">&#39;value&#39;</span><span class="p">]),</span>
+      <span class="k">lambda</span> <span class="n">reason</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__update</span><span class="p">(</span><span class="bp">None</span><span class="p">)</span>
+    <span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">__update</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
+    <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__value</span> <span class="o">==</span> <span class="n">value</span><span class="p">:</span>
+      <span class="k">return</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__value</span> <span class="o">=</span> <span class="n">value</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">emit</span><span class="p">(</span><span class="s1">&#39;changed&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__value</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">__onIntf</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
+    <span class="k">if</span> <span class="p">(</span><span class="n">args</span><span class="o">.</span><span class="n">node</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">node</span> <span class="ow">and</span> <span class="n">args</span><span class="o">.</span><span class="n">path</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">path</span> <span class="ow">and</span> <span class="n">args</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s1">&#39;com.screwerk.Sensor&#39;</span><span class="p">):</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__fetchValue</span><span class="p">()</span>
+
+  <span class="k">def</span> <span class="nf">__onIntfLost</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
+    <span class="k">if</span> <span class="p">(</span><span class="n">args</span><span class="o">.</span><span class="n">node</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">node</span> <span class="ow">and</span> <span class="n">args</span><span class="o">.</span><span class="n">path</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">path</span> <span class="ow">and</span> <span class="n">args</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s1">&#39;com.screwerk.Sensor&#39;</span><span class="p">):</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__update</span><span class="p">(</span><span class="bp">None</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">__onChanged</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
+       <span class="bp">self</span><span class="o">.</span><span class="n">__update</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="s1">&#39;value&#39;</span><span class="p">])</span>
+</pre></div>
+
+  </div>
+</div>
+
+
+      <div class="class">
+          <h3>Ancestors (in MRO)</h3>
+          <ul class="class_list">
+          <li><a href="/screwerk/supcon/switch.m.md#supcon.switch.NodeSensor">NodeSensor</a></li>
+          <li>supcon.util.EventEmitter</li>
+          <li>builtins.object</li>
+          </ul>
+          <h3>Instance variables</h3>
+            <div class="item">
+            <p id="supcon.switch.NodeSensor.node" class="name">var <span class="ident">node</span></p>
+            
+
+            
+  
+  <div class="source_cont">
+</div>
+
+            </div>
+            <div class="item">
+            <p id="supcon.switch.NodeSensor.path" class="name">var <span class="ident">path</span></p>
+            
+
+            
+  
+  <div class="source_cont">
+</div>
+
+            </div>
+            <div class="item">
+            <p id="supcon.switch.NodeSensor.value" class="name">var <span class="ident">value</span></p>
+            
+
+            
+  
+  <div class="source_cont">
+</div>
+
+            </div>
+          <h3>Methods</h3>
+            
+  <div class="item">
+    <div class="name def" id="supcon.switch.NodeSensor.__init__">
+    <p>def <span class="ident">__init__</span>(</p><p>self, local, node, path)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Initialize self.  See help(type(self)) for accurate signature.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.switch.NodeSensor.__init__', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.switch.NodeSensor.__init__" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">local</span><span class="p">:</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">Node</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
+  <span class="n">supcon</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">EventEmitter</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__local</span> <span class="o">=</span> <span class="n">local</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__node</span> <span class="o">=</span> <span class="n">node</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__path</span> <span class="o">=</span> <span class="n">path</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__value</span> <span class="o">=</span> <span class="bp">None</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">on</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;supcon.Local&#39;</span><span class="p">,</span> <span class="s1">&#39;intf&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__onIntf</span><span class="p">)</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">on</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;supcon.Local&#39;</span><span class="p">,</span> <span class="s1">&#39;intfLost&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__onIntfLost</span><span class="p">)</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">on</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">node</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">path</span><span class="p">,</span> <span class="s1">&#39;com.screwerk.Sensor&#39;</span><span class="p">,</span> <span class="s1">&#39;changed&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__onChanged</span><span class="p">)</span>
+  <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__local</span><span class="o">.</span><span class="n">nodes</span><span class="p">()</span><span class="o">.</span><span class="n">hasIntf</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">node</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">path</span><span class="p">,</span> <span class="s1">&#39;com.screwerk.com&#39;</span><span class="p">):</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__fetchValue</span><span class="p">()</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.switch.NodeSensor.emit">
+    <p>def <span class="ident">emit</span>(</p><p>self, event, *args)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Calls all callbacks for the given event with the given arguments</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.switch.NodeSensor.emit', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.switch.NodeSensor.emit" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">emit</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">  Calls all callbacks for the given event with the given arguments</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">if</span> <span class="n">event</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">:</span>
+    <span class="k">return</span>
+  <span class="k">for</span> <span class="n">callback</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">[</span><span class="n">event</span><span class="p">]</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
+    <span class="n">schedule</span><span class="p">(</span><span class="n">callback</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">))</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.switch.NodeSensor.off">
+    <p>def <span class="ident">off</span>(</p><p>self, event, callback)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Unregisters the given callback for the given event</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.switch.NodeSensor.off', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.switch.NodeSensor.off" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">off</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">callback</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">  Unregisters the given callback for the given event</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">if</span> <span class="n">event</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">:</span>
+    <span class="k">return</span>
+  <span class="k">if</span> <span class="nb">id</span><span class="p">(</span><span class="n">callback</span><span class="p">)</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">[</span><span class="n">event</span><span class="p">]:</span>
+    <span class="k">return</span>
+  <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">[</span><span class="n">event</span><span class="p">][</span><span class="nb">id</span><span class="p">(</span><span class="n">callback</span><span class="p">)]</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.switch.NodeSensor.on">
+    <p>def <span class="ident">on</span>(</p><p>self, event, callback)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Registers the given callback for the given event</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.switch.NodeSensor.on', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.switch.NodeSensor.on" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">on</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">callback</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">  Registers the given callback for the given event</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">if</span> <span class="nb">type</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">:</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">[</span><span class="n">event</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">[</span><span class="n">event</span><span class="p">][</span><span class="nb">id</span><span class="p">(</span><span class="n">callback</span><span class="p">)]</span> <span class="o">=</span> <span class="n">callback</span>
+  <span class="k">return</span> <span class="k">lambda</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">off</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">callback</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+      </div>
+      </div>
+      
+      <div class="item">
+      <p id="supcon.switch.PiGPIOSensor" class="name">class <span class="ident">PiGPIOSensor</span></p>
+      
+  
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.switch.PiGPIOSensor', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.switch.PiGPIOSensor" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">PiGPIOSensor</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+  <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">reactor</span><span class="p">,</span> <span class="n">gpio</span><span class="p">):</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__reactor</span> <span class="o">=</span> <span class="n">reactor</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span> <span class="o">=</span> <span class="n">gpio</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__pi</span> <span class="o">=</span> <span class="n">pigpio</span><span class="o">.</span><span class="n">pi</span><span class="p">()</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__pi</span><span class="o">.</span><span class="n">set_mode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span><span class="p">,</span> <span class="n">pigpio</span><span class="o">.</span><span class="n">INPUT</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__pi</span><span class="o">.</span><span class="n">set_glitch_filter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span><span class="p">,</span> <span class="mi">50000</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__pi</span><span class="o">.</span><span class="n">set_pull_up_down</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span><span class="p">,</span> <span class="n">pigpio</span><span class="o">.</span><span class="n">PUD_UP</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__pi</span><span class="o">.</span><span class="n">callback</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span><span class="p">,</span> <span class="n">pigpio</span><span class="o">.</span><span class="n">EITHER_EDGE</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callback</span><span class="p">)</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__value</span> <span class="o">=</span> <span class="nb">bool</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__pi</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span><span class="p">))</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__sensor</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">Implementation</span><span class="p">(</span><span class="n">SensorIntf</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__sensor</span><span class="o">.</span><span class="n">setCallCb</span><span class="p">(</span><span class="s1">&#39;value&#39;</span><span class="p">,</span> <span class="k">lambda</span><span class="p">:</span> <span class="p">{</span><span class="s1">&#39;value&#39;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__value</span><span class="p">})</span>
+
+  <span class="nd">@property</span>
+  <span class="k">def</span> <span class="nf">sensor</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__sensor</span>
+
+  <span class="k">def</span> <span class="nf">__callback</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">gpio</span><span class="p">,</span> <span class="n">level</span><span class="p">,</span> <span class="n">tick</span><span class="p">):</span>
+    <span class="k">if</span> <span class="n">level</span> <span class="o">&gt;=</span> <span class="mi">2</span><span class="p">:</span>
+      <span class="k">return</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__reactor</span><span class="o">.</span><span class="n">callFromThread</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__update</span><span class="p">,</span> <span class="nb">bool</span><span class="p">(</span><span class="n">level</span><span class="p">))</span>
+
+  <span class="k">def</span> <span class="nf">__update</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
+    <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__value</span> <span class="o">==</span> <span class="nb">bool</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
+      <span class="k">return</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__value</span> <span class="o">=</span> <span class="nb">bool</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__sensor</span><span class="o">.</span><span class="n">fire</span><span class="p">(</span><span class="s1">&#39;changed&#39;</span><span class="p">,</span> <span class="p">{</span><span class="s1">&#39;value&#39;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__value</span><span class="p">})</span>
+</pre></div>
+
+  </div>
+</div>
+
+
+      <div class="class">
+          <h3>Ancestors (in MRO)</h3>
+          <ul class="class_list">
+          <li><a href="/screwerk/supcon/switch.m.md#supcon.switch.PiGPIOSensor">PiGPIOSensor</a></li>
+          <li>builtins.object</li>
+          </ul>
+          <h3>Instance variables</h3>
+            <div class="item">
+            <p id="supcon.switch.PiGPIOSensor.sensor" class="name">var <span class="ident">sensor</span></p>
+            
+
+            
+  
+  <div class="source_cont">
+</div>
+
+            </div>
+          <h3>Methods</h3>
+            
+  <div class="item">
+    <div class="name def" id="supcon.switch.PiGPIOSensor.__init__">
+    <p>def <span class="ident">__init__</span>(</p><p>self, reactor, gpio)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Initialize self.  See help(type(self)) for accurate signature.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.switch.PiGPIOSensor.__init__', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.switch.PiGPIOSensor.__init__" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">reactor</span><span class="p">,</span> <span class="n">gpio</span><span class="p">):</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__reactor</span> <span class="o">=</span> <span class="n">reactor</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span> <span class="o">=</span> <span class="n">gpio</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__pi</span> <span class="o">=</span> <span class="n">pigpio</span><span class="o">.</span><span class="n">pi</span><span class="p">()</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__pi</span><span class="o">.</span><span class="n">set_mode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span><span class="p">,</span> <span class="n">pigpio</span><span class="o">.</span><span class="n">INPUT</span><span class="p">)</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__pi</span><span class="o">.</span><span class="n">set_glitch_filter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span><span class="p">,</span> <span class="mi">50000</span><span class="p">)</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__pi</span><span class="o">.</span><span class="n">set_pull_up_down</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span><span class="p">,</span> <span class="n">pigpio</span><span class="o">.</span><span class="n">PUD_UP</span><span class="p">)</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__pi</span><span class="o">.</span><span class="n">callback</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span><span class="p">,</span> <span class="n">pigpio</span><span class="o">.</span><span class="n">EITHER_EDGE</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callback</span><span class="p">)</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__value</span> <span class="o">=</span> <span class="nb">bool</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__pi</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span><span class="p">))</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__sensor</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">Implementation</span><span class="p">(</span><span class="n">SensorIntf</span><span class="p">)</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__sensor</span><span class="o">.</span><span class="n">setCallCb</span><span class="p">(</span><span class="s1">&#39;value&#39;</span><span class="p">,</span> <span class="k">lambda</span><span class="p">:</span> <span class="p">{</span><span class="s1">&#39;value&#39;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__value</span><span class="p">})</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+      </div>
+      </div>
+      
+      <div class="item">
+      <p id="supcon.switch.PiGPIOSwitch" class="name">class <span class="ident">PiGPIOSwitch</span></p>
+      
+  
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.switch.PiGPIOSwitch', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.switch.PiGPIOSwitch" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">PiGPIOSwitch</span><span class="p">(</span><span class="n">SoftSwitch</span><span class="p">):</span>
+  <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">gpio</span><span class="p">,</span> <span class="n">guard</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">effect</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">convert</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span> <span class="o">=</span> <span class="n">gpio</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__pi</span> <span class="o">=</span> <span class="n">pigpio</span><span class="o">.</span><span class="n">pi</span><span class="p">()</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__pi</span><span class="o">.</span><span class="n">set_mode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span><span class="p">,</span> <span class="n">pigpio</span><span class="o">.</span><span class="n">OUTPUT</span><span class="p">)</span>
+
+    <span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__pi</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span><span class="p">)</span>
+
+    <span class="k">def</span> <span class="nf">writeEffect</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">switch</span><span class="p">):</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__pi</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">value</span><span class="p">))</span>
+      <span class="k">if</span> <span class="nb">callable</span><span class="p">(</span><span class="n">effect</span><span class="p">):</span>
+        <span class="n">effect</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">switch</span><span class="p">)</span>
+
+    <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">guard</span><span class="p">,</span> <span class="n">writeEffect</span><span class="p">,</span> <span class="n">convert</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+
+      <div class="class">
+          <h3>Ancestors (in MRO)</h3>
+          <ul class="class_list">
+          <li><a href="/screwerk/supcon/switch.m.md#supcon.switch.PiGPIOSwitch">PiGPIOSwitch</a></li>
+          <li><a href="/screwerk/supcon/switch.m.md#supcon.switch.SoftSwitch">SoftSwitch</a></li>
+          <li><a href="/screwerk/supcon/switch.m.md#supcon.switch.SoftSensor">SoftSensor</a></li>
+          <li>builtins.object</li>
+          </ul>
+          <h3>Instance variables</h3>
+            <div class="item">
+            <p id="supcon.switch.PiGPIOSwitch.sensor" class="name">var <span class="ident">sensor</span></p>
+            
+    <p class="inheritance">
+     <strong>Inheritance:</strong>
+       <code><a href="/screwerk/supcon/switch.m.md#supcon.switch.SoftSwitch">SoftSwitch</a></code>.<code><a href="/screwerk/supcon/switch.m.md#supcon.switch.SoftSwitch.sensor">sensor</a></code>
+    </p>
+
+            
+  
+  <div class="source_cont">
+</div>
+
+            </div>
+            <div class="item">
+            <p id="supcon.switch.PiGPIOSwitch.switch" class="name">var <span class="ident">switch</span></p>
+            
+
+            
+  
+  <div class="source_cont">
+</div>
+
+            </div>
+            <div class="item">
+            <p id="supcon.switch.PiGPIOSwitch.value" class="name">var <span class="ident">value</span></p>
+            
+
+            
+  
+  <div class="source_cont">
+</div>
+
+            </div>
+          <h3>Methods</h3>
+            
+  <div class="item">
+    <div class="name def" id="supcon.switch.PiGPIOSwitch.__init__">
+    <p>def <span class="ident">__init__</span>(</p><p>self, gpio, guard=None, effect=None, convert=None)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Initialize self.  See help(type(self)) for accurate signature.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.switch.PiGPIOSwitch.__init__', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.switch.PiGPIOSwitch.__init__" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">gpio</span><span class="p">,</span> <span class="n">guard</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">effect</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">convert</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span> <span class="o">=</span> <span class="n">gpio</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__pi</span> <span class="o">=</span> <span class="n">pigpio</span><span class="o">.</span><span class="n">pi</span><span class="p">()</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__pi</span><span class="o">.</span><span class="n">set_mode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span><span class="p">,</span> <span class="n">pigpio</span><span class="o">.</span><span class="n">OUTPUT</span><span class="p">)</span>
+  <span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__pi</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span><span class="p">)</span>
+  <span class="k">def</span> <span class="nf">writeEffect</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">switch</span><span class="p">):</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__pi</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__gpio</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">value</span><span class="p">))</span>
+    <span class="k">if</span> <span class="nb">callable</span><span class="p">(</span><span class="n">effect</span><span class="p">):</span>
+      <span class="n">effect</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">switch</span><span class="p">)</span>
+  <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">guard</span><span class="p">,</span> <span class="n">writeEffect</span><span class="p">,</span> <span class="n">convert</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.switch.PiGPIOSwitch.update">
+    <p>def <span class="ident">update</span>(</p><p>self, value)</p>
+    </div>
+    
+
+    
+  
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.switch.PiGPIOSwitch.update', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.switch.PiGPIOSwitch.update" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
+  <span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__convert</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+  <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__value</span> <span class="o">==</span> <span class="n">value</span><span class="p">:</span>
+    <span class="k">return</span> <span class="bp">False</span>
+  <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">__guard</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">self</span><span class="p">):</span>
+    <span class="k">return</span> <span class="bp">False</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__value</span> <span class="o">=</span> <span class="n">value</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__effect</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__sensor</span><span class="o">.</span><span class="n">fire</span><span class="p">(</span><span class="s1">&#39;changed&#39;</span><span class="p">,</span> <span class="p">{</span><span class="s1">&#39;value&#39;</span><span class="p">:</span> <span class="n">value</span><span class="p">})</span>
+  <span class="k">return</span> <span class="bp">True</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+      </div>
+      </div>
+      
+      <div class="item">
+      <p id="supcon.switch.SoftSensor" class="name">class <span class="ident">SoftSensor</span></p>
+      
+  
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.switch.SoftSensor', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.switch.SoftSensor" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">SoftSensor</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+  <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">guard</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">effect</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">convert</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__guard</span> <span class="o">=</span> <span class="n">guard</span> <span class="ow">or</span> <span class="n">returnTrue</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__effect</span> <span class="o">=</span> <span class="n">effect</span> <span class="ow">or</span> <span class="n">returnNone</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__convert</span> <span class="o">=</span> <span class="n">convert</span> <span class="ow">or</span> <span class="n">returnFirst</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__convert</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__sensor</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">Implementation</span><span class="p">(</span><span class="n">SensorIntf</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__sensor</span><span class="o">.</span><span class="n">setCallCb</span><span class="p">(</span><span class="s1">&#39;value&#39;</span><span class="p">,</span> <span class="k">lambda</span><span class="p">:</span> <span class="p">{</span><span class="s1">&#39;value&#39;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__value</span><span class="p">})</span>
+
+  <span class="nd">@property</span>
+  <span class="k">def</span> <span class="nf">value</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__value</span>
+
+  <span class="nd">@property</span>
+  <span class="k">def</span> <span class="nf">sensor</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__sensor</span>
+
+  <span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
+    <span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__convert</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+    <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__value</span> <span class="o">==</span> <span class="n">value</span><span class="p">:</span>
+      <span class="k">return</span> <span class="bp">False</span>
+    <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">__guard</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">self</span><span class="p">):</span>
+      <span class="k">return</span> <span class="bp">False</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__value</span> <span class="o">=</span> <span class="n">value</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__effect</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__sensor</span><span class="o">.</span><span class="n">fire</span><span class="p">(</span><span class="s1">&#39;changed&#39;</span><span class="p">,</span> <span class="p">{</span><span class="s1">&#39;value&#39;</span><span class="p">:</span> <span class="n">value</span><span class="p">})</span>
+    <span class="k">return</span> <span class="bp">True</span>
+</pre></div>
+
+  </div>
+</div>
+
+
+      <div class="class">
+          <h3>Ancestors (in MRO)</h3>
+          <ul class="class_list">
+          <li><a href="/screwerk/supcon/switch.m.md#supcon.switch.SoftSensor">SoftSensor</a></li>
+          <li>builtins.object</li>
+          </ul>
+          <h3>Instance variables</h3>
+            <div class="item">
+            <p id="supcon.switch.SoftSensor.sensor" class="name">var <span class="ident">sensor</span></p>
+            
+
+            
+  
+  <div class="source_cont">
+</div>
+
+            </div>
+            <div class="item">
+            <p id="supcon.switch.SoftSensor.value" class="name">var <span class="ident">value</span></p>
+            
+
+            
+  
+  <div class="source_cont">
+</div>
+
+            </div>
+          <h3>Methods</h3>
+            
+  <div class="item">
+    <div class="name def" id="supcon.switch.SoftSensor.__init__">
+    <p>def <span class="ident">__init__</span>(</p><p>self, value=None, guard=None, effect=None, convert=None)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Initialize self.  See help(type(self)) for accurate signature.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.switch.SoftSensor.__init__', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.switch.SoftSensor.__init__" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">guard</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">effect</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">convert</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__guard</span> <span class="o">=</span> <span class="n">guard</span> <span class="ow">or</span> <span class="n">returnTrue</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__effect</span> <span class="o">=</span> <span class="n">effect</span> <span class="ow">or</span> <span class="n">returnNone</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__convert</span> <span class="o">=</span> <span class="n">convert</span> <span class="ow">or</span> <span class="n">returnFirst</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__convert</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__sensor</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">Implementation</span><span class="p">(</span><span class="n">SensorIntf</span><span class="p">)</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__sensor</span><span class="o">.</span><span class="n">setCallCb</span><span class="p">(</span><span class="s1">&#39;value&#39;</span><span class="p">,</span> <span class="k">lambda</span><span class="p">:</span> <span class="p">{</span><span class="s1">&#39;value&#39;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__value</span><span class="p">})</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.switch.SoftSensor.update">
+    <p>def <span class="ident">update</span>(</p><p>self, value)</p>
+    </div>
+    
+
+    
+  
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.switch.SoftSensor.update', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.switch.SoftSensor.update" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
+  <span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__convert</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+  <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__value</span> <span class="o">==</span> <span class="n">value</span><span class="p">:</span>
+    <span class="k">return</span> <span class="bp">False</span>
+  <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">__guard</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">self</span><span class="p">):</span>
+    <span class="k">return</span> <span class="bp">False</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__value</span> <span class="o">=</span> <span class="n">value</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__effect</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__sensor</span><span class="o">.</span><span class="n">fire</span><span class="p">(</span><span class="s1">&#39;changed&#39;</span><span class="p">,</span> <span class="p">{</span><span class="s1">&#39;value&#39;</span><span class="p">:</span> <span class="n">value</span><span class="p">})</span>
+  <span class="k">return</span> <span class="bp">True</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+      </div>
+      </div>
+      
+      <div class="item">
+      <p id="supcon.switch.SoftSwitch" class="name">class <span class="ident">SoftSwitch</span></p>
+      
+  
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.switch.SoftSwitch', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.switch.SoftSwitch" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">SoftSwitch</span><span class="p">(</span><span class="n">SoftSensor</span><span class="p">):</span>
+  <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span> <span class="n">guard</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">effect</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">convert</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+    <span class="n">boolConvert</span> <span class="o">=</span> <span class="p">(</span><span class="k">lambda</span> <span class="n">value</span><span class="p">:</span> <span class="nb">bool</span><span class="p">(</span><span class="n">convert</span><span class="p">(</span><span class="n">value</span><span class="p">)))</span> <span class="k">if</span> <span class="n">convert</span> <span class="k">else</span> <span class="nb">bool</span>
+    <span class="n">SoftSensor</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">guard</span><span class="p">,</span> <span class="n">effect</span><span class="p">,</span> <span class="n">boolConvert</span><span class="p">)</span>
+
+    <span class="n">update</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">value</span><span class="p">:</span> <span class="p">{}</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> <span class="k">else</span> <span class="p">{}</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__switch</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">Implementation</span><span class="p">(</span><span class="n">SwitchIntf</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__switch</span><span class="o">.</span><span class="n">setCallCb</span><span class="p">(</span><span class="s1">&#39;on&#39;</span><span class="p">,</span> <span class="k">lambda</span><span class="p">:</span> <span class="n">update</span><span class="p">(</span><span class="bp">True</span><span class="p">))</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__switch</span><span class="o">.</span><span class="n">setCallCb</span><span class="p">(</span><span class="s1">&#39;off&#39;</span><span class="p">,</span> <span class="k">lambda</span><span class="p">:</span> <span class="n">update</span><span class="p">(</span><span class="bp">False</span><span class="p">))</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__switch</span><span class="o">.</span><span class="n">setCallCb</span><span class="p">(</span><span class="s1">&#39;toggle&#39;</span><span class="p">,</span> <span class="k">lambda</span><span class="p">:</span> <span class="n">update</span><span class="p">(</span><span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">value</span><span class="p">))</span>
+
+  <span class="nd">@property</span>
+  <span class="k">def</span> <span class="nf">switch</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__switch</span>
+</pre></div>
+
+  </div>
+</div>
+
+
+      <div class="class">
+          <h3>Ancestors (in MRO)</h3>
+          <ul class="class_list">
+          <li><a href="/screwerk/supcon/switch.m.md#supcon.switch.SoftSwitch">SoftSwitch</a></li>
+          <li><a href="/screwerk/supcon/switch.m.md#supcon.switch.SoftSensor">SoftSensor</a></li>
+          <li>builtins.object</li>
+          </ul>
+          <h3>Instance variables</h3>
+            <div class="item">
+            <p id="supcon.switch.SoftSwitch.sensor" class="name">var <span class="ident">sensor</span></p>
+            
+    <p class="inheritance">
+     <strong>Inheritance:</strong>
+       <code><a href="/screwerk/supcon/switch.m.md#supcon.switch.SoftSensor">SoftSensor</a></code>.<code><a href="/screwerk/supcon/switch.m.md#supcon.switch.SoftSensor.sensor">sensor</a></code>
+    </p>
+
+            
+  
+  <div class="source_cont">
+</div>
+
+            </div>
+            <div class="item">
+            <p id="supcon.switch.SoftSwitch.switch" class="name">var <span class="ident">switch</span></p>
+            
+
+            
+  
+  <div class="source_cont">
+</div>
+
+            </div>
+            <div class="item">
+            <p id="supcon.switch.SoftSwitch.value" class="name">var <span class="ident">value</span></p>
+            
+
+            
+  
+  <div class="source_cont">
+</div>
+
+            </div>
+          <h3>Methods</h3>
+            
+  <div class="item">
+    <div class="name def" id="supcon.switch.SoftSwitch.__init__">
+    <p>def <span class="ident">__init__</span>(</p><p>self, value=False, guard=None, effect=None, convert=None)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Initialize self.  See help(type(self)) for accurate signature.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.switch.SoftSwitch.__init__', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.switch.SoftSwitch.__init__" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span> <span class="n">guard</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">effect</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">convert</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+  <span class="n">boolConvert</span> <span class="o">=</span> <span class="p">(</span><span class="k">lambda</span> <span class="n">value</span><span class="p">:</span> <span class="nb">bool</span><span class="p">(</span><span class="n">convert</span><span class="p">(</span><span class="n">value</span><span class="p">)))</span> <span class="k">if</span> <span class="n">convert</span> <span class="k">else</span> <span class="nb">bool</span>
+  <span class="n">SoftSensor</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">guard</span><span class="p">,</span> <span class="n">effect</span><span class="p">,</span> <span class="n">boolConvert</span><span class="p">)</span>
+  <span class="n">update</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">value</span><span class="p">:</span> <span class="p">{}</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> <span class="k">else</span> <span class="p">{}</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__switch</span> <span class="o">=</span> <span class="n">supcon</span><span class="o">.</span><span class="n">intf</span><span class="o">.</span><span class="n">Implementation</span><span class="p">(</span><span class="n">SwitchIntf</span><span class="p">)</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__switch</span><span class="o">.</span><span class="n">setCallCb</span><span class="p">(</span><span class="s1">&#39;on&#39;</span><span class="p">,</span> <span class="k">lambda</span><span class="p">:</span> <span class="n">update</span><span class="p">(</span><span class="bp">True</span><span class="p">))</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__switch</span><span class="o">.</span><span class="n">setCallCb</span><span class="p">(</span><span class="s1">&#39;off&#39;</span><span class="p">,</span> <span class="k">lambda</span><span class="p">:</span> <span class="n">update</span><span class="p">(</span><span class="bp">False</span><span class="p">))</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__switch</span><span class="o">.</span><span class="n">setCallCb</span><span class="p">(</span><span class="s1">&#39;toggle&#39;</span><span class="p">,</span> <span class="k">lambda</span><span class="p">:</span> <span class="n">update</span><span class="p">(</span><span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">value</span><span class="p">))</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.switch.SoftSwitch.update">
+    <p>def <span class="ident">update</span>(</p><p>self, value)</p>
+    </div>
+    
+
+    
+  
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.switch.SoftSwitch.update', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.switch.SoftSwitch.update" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
+  <span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__convert</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+  <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__value</span> <span class="o">==</span> <span class="n">value</span><span class="p">:</span>
+    <span class="k">return</span> <span class="bp">False</span>
+  <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">__guard</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">self</span><span class="p">):</span>
+    <span class="k">return</span> <span class="bp">False</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__value</span> <span class="o">=</span> <span class="n">value</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__effect</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__sensor</span><span class="o">.</span><span class="n">fire</span><span class="p">(</span><span class="s1">&#39;changed&#39;</span><span class="p">,</span> <span class="p">{</span><span class="s1">&#39;value&#39;</span><span class="p">:</span> <span class="n">value</span><span class="p">})</span>
+  <span class="k">return</span> <span class="bp">True</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+      </div>
+      </div>
+
+  </section>
+
+    </article>
+</div>
diff --git a/doc/util.m.md b/doc/util.m.md
new file mode 100644 (file)
index 0000000..769000c
--- /dev/null
@@ -0,0 +1,1346 @@
+<link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,300' rel='stylesheet' type='text/css'>
+
+
+<style type="text/css">
+
+  .CONTENT {
+    padding: 0;
+  }
+
+  #container {
+    display: flex;
+    flex-directtion: column;
+  }
+
+  #content {
+    padding: 30px;
+    border-left: 1px solid #ddd;
+  }
+  #sidebar {
+    padding: 30px;
+  }
+
+  #footer {
+    font-size: .75em;
+    padding: 5px 30px;
+    border-top: 1px solid #ddd;
+    text-align: right;
+  }
+  #footer p {
+    margin: 0 0 0 30px;
+    display: inline-block;
+  }
+
+  h1, h2, h3, h4, h5 {
+    font-weight: 300;
+  }
+  h1 {
+    font-size: 2.5em;
+    line-height: 1.1em;
+    margin: 0 0 .50em 0;
+  }
+
+  h2 {
+    font-size: 1.75em;
+    margin: 1em 0 .50em 0;
+  }
+
+  h3 {
+    margin: 25px 0 10px 0;
+  }
+
+  h4 {
+    margin: 0;
+    font-size: 105%;
+  }
+
+  a {
+    color: #058;
+    text-decoration: none;
+    transition: color .3s ease-in-out;
+  }
+
+  a:hover {
+    color: #e08524;
+    transition: color .3s ease-in-out;
+  }
+
+  pre, code, .mono, .name {
+    font-family: "Ubuntu Mono", "Cousine", "DejaVu Sans Mono", monospace;
+  }
+
+  .title .name {
+    font-weight: bold;
+  }
+  .section-title {
+    margin-top: 2em;
+  }
+  .ident {
+    color: #900;
+  }
+
+  code {
+    background: #f9f9f9;
+  } 
+
+  pre {
+    background: #fefefe;
+    border: 1px solid #ddd;
+    box-shadow: 2px 2px 0 #f3f3f3;
+    margin: 0 30px;
+    padding: 15px 30px;
+  }
+
+  .codehilite {
+    margin: 0 30px 10px 30px;
+  }
+
+    .codehilite pre {
+      margin: 0;
+    }
+    .codehilite .err { background: #ff3300; color: #fff !important; } 
+
+  table#module-list {
+    font-size: 110%;
+  }
+
+    table#module-list tr td:first-child {
+      padding-right: 10px;
+      white-space: nowrap;
+    }
+
+    table#module-list td {
+      vertical-align: top;
+      padding-bottom: 8px;
+    }
+
+      table#module-list td p {
+        margin: 0 0 7px 0;
+      }
+
+  .def {
+    display: table;
+  }
+
+    .def p {
+      display: table-cell;
+      vertical-align: top;
+      text-align: left;
+    }
+
+    .def p:first-child {
+      white-space: nowrap;
+    }
+
+    .def p:last-child {
+      width: 100%;
+    }
+
+
+  #index {
+    list-style-type: none;
+    margin: 0;
+    padding: 0;
+  }
+    ul#index .class_name {
+      /* font-size: 110%; */
+      font-weight: bold;
+    }
+    #index ul {
+      margin: 0;
+    }
+
+  .item {
+    margin: 0 0 15px 0;
+  }
+
+    .item .class {
+      margin: 0 0 25px 30px;
+    }
+
+      .item .class ul.class_list {
+        margin: 0 0 20px 0;
+      }
+
+    .item .name {
+      background: #fafafa;
+      margin: 0;
+      font-weight: bold;
+      padding: 5px 10px;
+      border-radius: 3px;
+      display: inline-block;
+      min-width: 40%;
+    }
+      .item .name:hover {
+        background: #f6f6f6;
+      }
+
+    .item .empty_desc {
+      margin: 0 0 5px 0;
+      padding: 0;
+    }
+
+    .item .inheritance {
+      margin: 3px 0 0 30px;
+    }
+
+    .item .inherited {
+      color: #666;
+    }
+
+    .item .desc {
+      padding: 0 8px;
+      margin: 0;
+    }
+
+      .item .desc p {
+        margin: 0 0 10px 0;
+      }
+
+    .source_cont {
+      margin: 0;
+      padding: 0;
+    }
+
+    .source_link a {
+      background: #ffc300;
+      font-weight: 400;
+      font-size: .75em;
+      text-transform: uppercase;
+      color: #fff;
+      text-shadow: 1px 1px 0 #f4b700;
+      
+      padding: 3px 8px;
+      border-radius: 2px;
+      transition: background .3s ease-in-out;
+    }
+      .source_link a:hover {
+        background: #FF7200;
+        text-shadow: none;
+        transition: background .3s ease-in-out;
+      }
+
+    .source {
+      display: none;
+      max-height: 600px;
+      overflow-y: scroll;
+      margin-bottom: 15px;
+    }
+
+      .source .codehilite {
+        margin: 0;
+      }
+
+  .desc h1, .desc h2, .desc h3 {
+    font-size: 100% !important;
+  }
+  .clear {
+    clear: both;
+  }
+
+  @media all and (max-width: 950px) {
+    #sidebar {
+      width: 35%;
+    }
+    #content {
+      width: 65%;
+    }
+  }
+  @media all and (max-width: 650px) {
+    #top {
+      display: none;
+    }
+    #sidebar {
+      float: none;
+      width: auto;
+    }
+    #content {
+      float: none;
+      width: auto;
+      padding: 30px;
+    }
+
+    #index ul {
+      padding: 0;
+      margin-bottom: 15px;
+    }
+    #index ul li {
+      display: inline-block;
+      margin-right: 30px;
+    }
+    #footer {
+      text-align: left;
+    }
+    #footer p {
+      display: block;
+      margin: inherit;
+    }
+  }
+
+  /*****************************/
+
+</style>
+
+<style type="text/css">
+.codehilite .hll { background-color: #ffffcc }
+.codehilite  { background: #f8f8f8; }
+.codehilite .c { color: #408080; font-style: italic } /* Comment */
+.codehilite .err { border: 1px solid #FF0000 } /* Error */
+.codehilite .k { color: #008000; font-weight: bold } /* Keyword */
+.codehilite .o { color: #666666 } /* Operator */
+.codehilite .ch { color: #408080; font-style: italic } /* Comment.Hashbang */
+.codehilite .cm { color: #408080; font-style: italic } /* Comment.Multiline */
+.codehilite .cp { color: #BC7A00 } /* Comment.Preproc */
+.codehilite .cpf { color: #408080; font-style: italic } /* Comment.PreprocFile */
+.codehilite .c1 { color: #408080; font-style: italic } /* Comment.Single */
+.codehilite .cs { color: #408080; font-style: italic } /* Comment.Special */
+.codehilite .gd { color: #A00000 } /* Generic.Deleted */
+.codehilite .ge { font-style: italic } /* Generic.Emph */
+.codehilite .gr { color: #FF0000 } /* Generic.Error */
+.codehilite .gh { color: #000080; font-weight: bold } /* Generic.Heading */
+.codehilite .gi { color: #00A000 } /* Generic.Inserted */
+.codehilite .go { color: #888888 } /* Generic.Output */
+.codehilite .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
+.codehilite .gs { font-weight: bold } /* Generic.Strong */
+.codehilite .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
+.codehilite .gt { color: #0044DD } /* Generic.Traceback */
+.codehilite .kc { color: #008000; font-weight: bold } /* Keyword.Constant */
+.codehilite .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
+.codehilite .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
+.codehilite .kp { color: #008000 } /* Keyword.Pseudo */
+.codehilite .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
+.codehilite .kt { color: #B00040 } /* Keyword.Type */
+.codehilite .m { color: #666666 } /* Literal.Number */
+.codehilite .s { color: #BA2121 } /* Literal.String */
+.codehilite .na { color: #7D9029 } /* Name.Attribute */
+.codehilite .nb { color: #008000 } /* Name.Builtin */
+.codehilite .nc { color: #0000FF; font-weight: bold } /* Name.Class */
+.codehilite .no { color: #880000 } /* Name.Constant */
+.codehilite .nd { color: #AA22FF } /* Name.Decorator */
+.codehilite .ni { color: #999999; font-weight: bold } /* Name.Entity */
+.codehilite .ne { color: #D2413A; font-weight: bold } /* Name.Exception */
+.codehilite .nf { color: #0000FF } /* Name.Function */
+.codehilite .nl { color: #A0A000 } /* Name.Label */
+.codehilite .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
+.codehilite .nt { color: #008000; font-weight: bold } /* Name.Tag */
+.codehilite .nv { color: #19177C } /* Name.Variable */
+.codehilite .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
+.codehilite .w { color: #bbbbbb } /* Text.Whitespace */
+.codehilite .mb { color: #666666 } /* Literal.Number.Bin */
+.codehilite .mf { color: #666666 } /* Literal.Number.Float */
+.codehilite .mh { color: #666666 } /* Literal.Number.Hex */
+.codehilite .mi { color: #666666 } /* Literal.Number.Integer */
+.codehilite .mo { color: #666666 } /* Literal.Number.Oct */
+.codehilite .sa { color: #BA2121 } /* Literal.String.Affix */
+.codehilite .sb { color: #BA2121 } /* Literal.String.Backtick */
+.codehilite .sc { color: #BA2121 } /* Literal.String.Char */
+.codehilite .dl { color: #BA2121 } /* Literal.String.Delimiter */
+.codehilite .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
+.codehilite .s2 { color: #BA2121 } /* Literal.String.Double */
+.codehilite .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */
+.codehilite .sh { color: #BA2121 } /* Literal.String.Heredoc */
+.codehilite .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */
+.codehilite .sx { color: #008000 } /* Literal.String.Other */
+.codehilite .sr { color: #BB6688 } /* Literal.String.Regex */
+.codehilite .s1 { color: #BA2121 } /* Literal.String.Single */
+.codehilite .ss { color: #19177C } /* Literal.String.Symbol */
+.codehilite .bp { color: #008000 } /* Name.Builtin.Pseudo */
+.codehilite .fm { color: #0000FF } /* Name.Function.Magic */
+.codehilite .vc { color: #19177C } /* Name.Variable.Class */
+.codehilite .vg { color: #19177C } /* Name.Variable.Global */
+.codehilite .vi { color: #19177C } /* Name.Variable.Instance */
+.codehilite .vm { color: #19177C } /* Name.Variable.Magic */
+.codehilite .il { color: #666666 } /* Literal.Number.Integer.Long */
+</style>
+
+<script type="text/javascript">
+function toggle(id, $link) {
+  $node = document.getElementById(id);
+  if (!$node) return;
+  if (!$node.style.display || $node.style.display == 'none') {
+    $node.style.display = 'block';
+    $link.innerHTML = 'Hide source &nequiv;';
+  } else {
+    $node.style.display = 'none';
+    $link.innerHTML = 'Show source &equiv;';
+  }
+}
+</script>
+
+<div id="container">
+    
+  
+  <div id="sidebar">
+    <a href="/screwerk/supcon">Doc</a>
+
+    <h1>Index</h1>
+    <ul id="index">
+
+    <li class="set"><h3><a href="/screwerk/supcon/util.m.md#header-functions">Functions</a></h3>
+      
+  <ul>
+    <li class="mono"><a href="/screwerk/supcon/util.m.md#supcon.util.schedule">schedule</a></li>
+  </ul>
+
+    </li>
+
+    <li class="set"><h3><a href="/screwerk/supcon/util.m.md#header-classes">Classes</a></h3>
+      <ul>
+        <li class="mono">
+        <span class="class_name"><a href="/screwerk/supcon/util.m.md#supcon.util.Dumpable">Dumpable</a></span>
+        
+          
+  <ul>
+    <li class="mono"><a href="/screwerk/supcon/util.m.md#supcon.util.Dumpable.load">load</a></li>
+    <li class="mono"><a href="/screwerk/supcon/util.m.md#supcon.util.Dumpable.dump">dump</a></li>
+  </ul>
+
+        </li>
+        <li class="mono">
+        <span class="class_name"><a href="/screwerk/supcon/util.m.md#supcon.util.EventEmitter">EventEmitter</a></span>
+        
+          
+  <ul>
+    <li class="mono"><a href="/screwerk/supcon/util.m.md#supcon.util.EventEmitter.__init__">__init__</a></li>
+    <li class="mono"><a href="/screwerk/supcon/util.m.md#supcon.util.EventEmitter.emit">emit</a></li>
+    <li class="mono"><a href="/screwerk/supcon/util.m.md#supcon.util.EventEmitter.off">off</a></li>
+    <li class="mono"><a href="/screwerk/supcon/util.m.md#supcon.util.EventEmitter.on">on</a></li>
+  </ul>
+
+        </li>
+        <li class="mono">
+        <span class="class_name"><a href="/screwerk/supcon/util.m.md#supcon.util.Named">Named</a></span>
+        
+        </li>
+        <li class="mono">
+        <span class="class_name"><a href="/screwerk/supcon/util.m.md#supcon.util.NamedList">NamedList</a></span>
+        
+          
+  <ul>
+    <li class="mono"><a href="/screwerk/supcon/util.m.md#supcon.util.NamedList.load">load</a></li>
+    <li class="mono"><a href="/screwerk/supcon/util.m.md#supcon.util.NamedList.to">to</a></li>
+    <li class="mono"><a href="/screwerk/supcon/util.m.md#supcon.util.NamedList.__init__">__init__</a></li>
+    <li class="mono"><a href="/screwerk/supcon/util.m.md#supcon.util.NamedList.dump">dump</a></li>
+    <li class="mono"><a href="/screwerk/supcon/util.m.md#supcon.util.NamedList.get">get</a></li>
+    <li class="mono"><a href="/screwerk/supcon/util.m.md#supcon.util.NamedList.items">items</a></li>
+    <li class="mono"><a href="/screwerk/supcon/util.m.md#supcon.util.NamedList.keys">keys</a></li>
+    <li class="mono"><a href="/screwerk/supcon/util.m.md#supcon.util.NamedList.values">values</a></li>
+  </ul>
+
+        </li>
+      </ul>
+    </li>
+
+    </ul>
+  </div>
+
+    <article id="content">
+      
+  
+
+  
+
+
+  <header id="section-intro">
+  <h1 class="title"><span class="name">supcon.util</span> module</h1>
+  
+  
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.util', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.util" class="source">
+    <div class="codehilite"><pre><span></span><span class="c1"># -*- coding: utf-8 -*-</span>
+
+<span class="kn">import</span> <span class="nn">abc</span>
+
+<span class="kn">import</span> <span class="nn">asyncio</span>
+<span class="kn">import</span> <span class="nn">collections</span>
+<span class="kn">import</span> <span class="nn">collections.abc</span>
+
+<span class="kn">import</span> <span class="nn">twisted.internet.defer</span>
+
+<span class="k">def</span> <span class="nf">schedule</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
+  <span class="k">if</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">iscoroutine</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
+    <span class="n">obj</span> <span class="o">=</span> <span class="n">twisted</span><span class="o">.</span><span class="n">internet</span><span class="o">.</span><span class="n">defer</span><span class="o">.</span><span class="n">ensureDeferred</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
+  <span class="k">return</span> <span class="n">obj</span>
+
+<span class="k">class</span> <span class="nc">Dumpable</span><span class="p">(</span><span class="n">abc</span><span class="o">.</span><span class="n">ABC</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">  The abstract base class `supcon.util.Dumpable`.</span>
+
+<span class="sd">  Implementations of this abstract base class can be converted to and from</span>
+<span class="sd">  &#39;simple&#39; datastructures containing only ints, floats, strings, lists and</span>
+<span class="sd">  dicts. These simple datastructures can be send and received by the supcon</span>
+<span class="sd">  bus. If you only ever use simple datastructures you can ignore this class.</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+
+  <span class="nd">@abc.abstractmethod</span>
+  <span class="k">def</span> <span class="nf">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    Converts the `supcon.util.Dumpable` into a &#39;simple&#39; datastructure.</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+
+  <span class="nd">@abc.abstractclassmethod</span>
+  <span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    Converts the given &#39;simple&#39; datastructure **data** into an instance of</span>
+<span class="sd">    **cls**, a subclass of `supcon.util.Dumpable`</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+
+
+<span class="k">class</span> <span class="nc">Named</span><span class="p">(</span><span class="n">abc</span><span class="o">.</span><span class="n">ABC</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">  The abstract base class `supcon.util.Named`.</span>
+
+<span class="sd">  Implementations of this abstract base class must have a property</span>
+<span class="sd">  `supcon.util.Named.name`, that can be used as a key in a dictionary.</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+
+  <span class="nd">@property</span>
+  <span class="nd">@abc.abstractmethod</span>
+  <span class="k">def</span> <span class="nf">name</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
+    <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    The name of the instance. Is useable as a dictionary key.</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+
+
+<span class="k">class</span> <span class="nc">NamedList</span><span class="p">(</span><span class="n">collections</span><span class="o">.</span><span class="n">abc</span><span class="o">.</span><span class="n">Mapping</span><span class="p">,</span> <span class="n">Dumpable</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">  A `supcon.util.NamedList` is an ordered, readonly dictionary of</span>
+<span class="sd">  `supcon.util.Named` and `supcon.util.Dumpable` elements of value type</span>
+<span class="sd">  `supcon.util.NamedList.vtype`.</span>
+
+<span class="sd">  The class `supcon.util.NamedList` itself can not be instantiated. It must be</span>
+<span class="sd">  subclassed and the class property `supcon.util.NamedList.vtype` set. The class</span>
+<span class="sd">  property `supcon.util.NamedList.vtype` denotes the type of the elements that</span>
+<span class="sd">  the list can contain. The type `supcon.util.NamedList.vtype` must be a</span>
+<span class="sd">  subclass of `supcon.util.Named` and of `supcon.util.Dumpable`. Elements in the</span>
+<span class="sd">  `supcon.util.NamedList.vtype` can be accessed by the values of their</span>
+<span class="sd">  `supcon.util.Named.name` property.</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+
+  <span class="n">vtype</span> <span class="o">=</span> <span class="bp">None</span>
+  <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">  Must be assigned in a subclass of `supcon.util.NamedList` to a subclass</span>
+<span class="sd">  of `supcon.util.Named` and `supcon.util.Dumpable`</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+
+  <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">values</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    Initializes the `supcon.util.NamedList` with the given list of **values**.</span>
+
+<span class="sd">    An element of **values** must be of type `supcon.util.NamedList.vtype` or a</span>
+<span class="sd">    &#39;simple&#39; datastructure that can be converted to an instance of</span>
+<span class="sd">    `supcon.util.NamedList.vtype` by `supcon.util.NamedList.vtype`.load().</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">if</span> <span class="n">values</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+      <span class="n">values</span> <span class="o">=</span> <span class="p">[]</span>
+    <span class="k">if</span> <span class="ow">not</span> <span class="nb">issubclass</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="p">,</span> <span class="n">Named</span><span class="p">):</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;the value type must be a subclass of Named&#39;</span><span class="p">)</span>
+    <span class="k">if</span> <span class="ow">not</span> <span class="nb">issubclass</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="p">,</span> <span class="n">Dumpable</span><span class="p">):</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;the value type must be a subclass of Dumpable&#39;</span><span class="p">)</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__values</span> <span class="o">=</span> <span class="n">collections</span><span class="o">.</span><span class="n">OrderedDict</span><span class="p">()</span>
+
+    <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">values</span><span class="p">:</span>
+      <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="p">):</span>
+        <span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+      <span class="k">if</span> <span class="n">value</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__values</span><span class="p">:</span>
+        <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;value.name must be unique in the given list of values&#39;</span><span class="p">)</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__values</span><span class="p">[</span><span class="n">value</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
+
+  <span class="k">def</span> <span class="fm">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__values</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
+
+  <span class="k">def</span> <span class="fm">__iter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="k">return</span> <span class="nb">iter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__values</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="fm">__len__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__values</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="k">return</span> <span class="s2">&quot;{}.{}({})&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
+      <span class="bp">self</span><span class="o">.</span><span class="vm">__module__</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span>
+      <span class="s1">&#39;, &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="nb">repr</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">items</span><span class="p">()])</span>
+    <span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    Converts the `supcon.util.NamedList` into a list of &#39;simple&#39; datastructures.</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">return</span> <span class="p">[</span><span class="n">value</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span> <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()]</span>
+
+  <span class="nd">@classmethod</span>
+  <span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    Converts the given list of &#39;simple&#39; datastructures **data** into an instance</span>
+<span class="sd">    of **cls**, a subclass of `supcon.util.NamedList`.</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
+
+  <span class="nd">@classmethod</span>
+  <span class="k">def</span> <span class="nf">to</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    If the the **value** is an instance of **cls**, a subclass of</span>
+<span class="sd">    `supcon.util.NamedList`, the value is returned. If value is not an instance</span>
+<span class="sd">    of **cls** the method tries to convert the **value** into an instance of</span>
+<span class="sd">    **cls**.</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">return</span> <span class="n">value</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">cls</span><span class="p">)</span> <span class="k">else</span> <span class="bp">cls</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+
+
+<span class="k">class</span> <span class="nc">EventEmitter</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+
+  <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span> <span class="o">=</span> <span class="p">{}</span>
+
+  <span class="k">def</span> <span class="nf">on</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">callback</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    Registers the given callback for the given event</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">if</span> <span class="nb">type</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">:</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">[</span><span class="n">event</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">[</span><span class="n">event</span><span class="p">][</span><span class="nb">id</span><span class="p">(</span><span class="n">callback</span><span class="p">)]</span> <span class="o">=</span> <span class="n">callback</span>
+    <span class="k">return</span> <span class="k">lambda</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">off</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">callback</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">off</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">callback</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    Unregisters the given callback for the given event</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">if</span> <span class="n">event</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">:</span>
+      <span class="k">return</span>
+    <span class="k">if</span> <span class="nb">id</span><span class="p">(</span><span class="n">callback</span><span class="p">)</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">[</span><span class="n">event</span><span class="p">]:</span>
+      <span class="k">return</span>
+    <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">[</span><span class="n">event</span><span class="p">][</span><span class="nb">id</span><span class="p">(</span><span class="n">callback</span><span class="p">)]</span>
+
+  <span class="k">def</span> <span class="nf">emit</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    Calls all callbacks for the given event with the given arguments</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">if</span> <span class="n">event</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">:</span>
+      <span class="k">return</span>
+    <span class="k">for</span> <span class="n">callback</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">[</span><span class="n">event</span><span class="p">]</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
+      <span class="n">schedule</span><span class="p">(</span><span class="n">callback</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">))</span>
+</pre></div>
+
+  </div>
+
+  </header>
+
+  <section id="section-items">
+
+    <h2 class="section-title" id="header-functions">Functions</h2>
+      
+  <div class="item">
+    <div class="name def" id="supcon.util.schedule">
+    <p>def <span class="ident">schedule</span>(</p><p>obj)</p>
+    </div>
+    
+
+    
+  
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.util.schedule', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.util.schedule" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">schedule</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
+  <span class="k">if</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">iscoroutine</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
+    <span class="n">obj</span> <span class="o">=</span> <span class="n">twisted</span><span class="o">.</span><span class="n">internet</span><span class="o">.</span><span class="n">defer</span><span class="o">.</span><span class="n">ensureDeferred</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
+  <span class="k">return</span> <span class="n">obj</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+
+    <h2 class="section-title" id="header-classes">Classes</h2>
+      
+      <div class="item">
+      <p id="supcon.util.Dumpable" class="name">class <span class="ident">Dumpable</span></p>
+      
+  
+    <div class="desc"><p>The abstract base class <a href="/screwerk/supcon/util.m.md#supcon.util.Dumpable"><code>Dumpable</code></a>.</p>
+<p>Implementations of this abstract base class can be converted to and from
+'simple' datastructures containing only ints, floats, strings, lists and
+dicts. These simple datastructures can be send and received by the supcon
+bus. If you only ever use simple datastructures you can ignore this class.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.util.Dumpable', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.util.Dumpable" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">Dumpable</span><span class="p">(</span><span class="n">abc</span><span class="o">.</span><span class="n">ABC</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">  The abstract base class `supcon.util.Dumpable`.</span>
+
+<span class="sd">  Implementations of this abstract base class can be converted to and from</span>
+<span class="sd">  &#39;simple&#39; datastructures containing only ints, floats, strings, lists and</span>
+<span class="sd">  dicts. These simple datastructures can be send and received by the supcon</span>
+<span class="sd">  bus. If you only ever use simple datastructures you can ignore this class.</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+
+  <span class="nd">@abc.abstractmethod</span>
+  <span class="k">def</span> <span class="nf">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    Converts the `supcon.util.Dumpable` into a &#39;simple&#39; datastructure.</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+
+  <span class="nd">@abc.abstractclassmethod</span>
+  <span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    Converts the given &#39;simple&#39; datastructure **data** into an instance of</span>
+<span class="sd">    **cls**, a subclass of `supcon.util.Dumpable`</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+</pre></div>
+
+  </div>
+</div>
+
+
+      <div class="class">
+          <h3>Ancestors (in MRO)</h3>
+          <ul class="class_list">
+          <li><a href="/screwerk/supcon/util.m.md#supcon.util.Dumpable">Dumpable</a></li>
+          <li>abc.ABC</li>
+          <li>builtins.object</li>
+          </ul>
+          <h3>Class Methods</h3>
+            
+  <div class="item">
+    <div class="name def" id="supcon.util.Dumpable.load">
+    <p>def <span class="ident">load</span>(</p><p>cls, data)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Converts the given 'simple' datastructure <strong>data</strong> into an instance of
+<strong>cls</strong>, a subclass of <a href="/screwerk/supcon/util.m.md#supcon.util.Dumpable"><code>Dumpable</code></a></p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.util.Dumpable.load', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.util.Dumpable.load" class="source">
+    <div class="codehilite"><pre><span></span><span class="nd">@abc.abstractclassmethod</span>
+<span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">  Converts the given &#39;simple&#39; datastructure **data** into an instance of</span>
+<span class="sd">  **cls**, a subclass of `supcon.util.Dumpable`</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">pass</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+          <h3>Methods</h3>
+            
+  <div class="item">
+    <div class="name def" id="supcon.util.Dumpable.dump">
+    <p>def <span class="ident">dump</span>(</p><p>self)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Converts the <a href="/screwerk/supcon/util.m.md#supcon.util.Dumpable"><code>Dumpable</code></a> into a 'simple' datastructure.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.util.Dumpable.dump', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.util.Dumpable.dump" class="source">
+    <div class="codehilite"><pre><span></span><span class="nd">@abc.abstractmethod</span>
+<span class="k">def</span> <span class="nf">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">  Converts the `supcon.util.Dumpable` into a &#39;simple&#39; datastructure.</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">pass</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+      </div>
+      </div>
+      
+      <div class="item">
+      <p id="supcon.util.EventEmitter" class="name">class <span class="ident">EventEmitter</span></p>
+      
+  
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.util.EventEmitter', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.util.EventEmitter" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">EventEmitter</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+
+  <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span> <span class="o">=</span> <span class="p">{}</span>
+
+  <span class="k">def</span> <span class="nf">on</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">callback</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    Registers the given callback for the given event</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">if</span> <span class="nb">type</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">:</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">[</span><span class="n">event</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">[</span><span class="n">event</span><span class="p">][</span><span class="nb">id</span><span class="p">(</span><span class="n">callback</span><span class="p">)]</span> <span class="o">=</span> <span class="n">callback</span>
+    <span class="k">return</span> <span class="k">lambda</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">off</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">callback</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">off</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">callback</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    Unregisters the given callback for the given event</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">if</span> <span class="n">event</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">:</span>
+      <span class="k">return</span>
+    <span class="k">if</span> <span class="nb">id</span><span class="p">(</span><span class="n">callback</span><span class="p">)</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">[</span><span class="n">event</span><span class="p">]:</span>
+      <span class="k">return</span>
+    <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">[</span><span class="n">event</span><span class="p">][</span><span class="nb">id</span><span class="p">(</span><span class="n">callback</span><span class="p">)]</span>
+
+  <span class="k">def</span> <span class="nf">emit</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    Calls all callbacks for the given event with the given arguments</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">if</span> <span class="n">event</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">:</span>
+      <span class="k">return</span>
+    <span class="k">for</span> <span class="n">callback</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">[</span><span class="n">event</span><span class="p">]</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
+      <span class="n">schedule</span><span class="p">(</span><span class="n">callback</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">))</span>
+</pre></div>
+
+  </div>
+</div>
+
+
+      <div class="class">
+          <h3>Ancestors (in MRO)</h3>
+          <ul class="class_list">
+          <li><a href="/screwerk/supcon/util.m.md#supcon.util.EventEmitter">EventEmitter</a></li>
+          <li>builtins.object</li>
+          </ul>
+          <h3>Methods</h3>
+            
+  <div class="item">
+    <div class="name def" id="supcon.util.EventEmitter.__init__">
+    <p>def <span class="ident">__init__</span>(</p><p>self)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Initialize self.  See help(type(self)) for accurate signature.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.util.EventEmitter.__init__', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.util.EventEmitter.__init__" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span> <span class="o">=</span> <span class="p">{}</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.util.EventEmitter.emit">
+    <p>def <span class="ident">emit</span>(</p><p>self, event, *args)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Calls all callbacks for the given event with the given arguments</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.util.EventEmitter.emit', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.util.EventEmitter.emit" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">emit</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">  Calls all callbacks for the given event with the given arguments</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">if</span> <span class="n">event</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">:</span>
+    <span class="k">return</span>
+  <span class="k">for</span> <span class="n">callback</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">[</span><span class="n">event</span><span class="p">]</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
+    <span class="n">schedule</span><span class="p">(</span><span class="n">callback</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">))</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.util.EventEmitter.off">
+    <p>def <span class="ident">off</span>(</p><p>self, event, callback)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Unregisters the given callback for the given event</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.util.EventEmitter.off', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.util.EventEmitter.off" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">off</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">callback</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">  Unregisters the given callback for the given event</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">if</span> <span class="n">event</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">:</span>
+    <span class="k">return</span>
+  <span class="k">if</span> <span class="nb">id</span><span class="p">(</span><span class="n">callback</span><span class="p">)</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">[</span><span class="n">event</span><span class="p">]:</span>
+    <span class="k">return</span>
+  <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">[</span><span class="n">event</span><span class="p">][</span><span class="nb">id</span><span class="p">(</span><span class="n">callback</span><span class="p">)]</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.util.EventEmitter.on">
+    <p>def <span class="ident">on</span>(</p><p>self, event, callback)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Registers the given callback for the given event</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.util.EventEmitter.on', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.util.EventEmitter.on" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">on</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">callback</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">  Registers the given callback for the given event</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">if</span> <span class="nb">type</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">:</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">[</span><span class="n">event</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__callbacks</span><span class="p">[</span><span class="n">event</span><span class="p">][</span><span class="nb">id</span><span class="p">(</span><span class="n">callback</span><span class="p">)]</span> <span class="o">=</span> <span class="n">callback</span>
+  <span class="k">return</span> <span class="k">lambda</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">off</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">callback</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+      </div>
+      </div>
+      
+      <div class="item">
+      <p id="supcon.util.Named" class="name">class <span class="ident">Named</span></p>
+      
+  
+    <div class="desc"><p>The abstract base class <a href="/screwerk/supcon/util.m.md#supcon.util.Named"><code>Named</code></a>.</p>
+<p>Implementations of this abstract base class must have a property
+<a href="/screwerk/supcon/util.m.md#supcon.util.Named.name"><code>name</code></a>, that can be used as a key in a dictionary.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.util.Named', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.util.Named" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">Named</span><span class="p">(</span><span class="n">abc</span><span class="o">.</span><span class="n">ABC</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">  The abstract base class `supcon.util.Named`.</span>
+
+<span class="sd">  Implementations of this abstract base class must have a property</span>
+<span class="sd">  `supcon.util.Named.name`, that can be used as a key in a dictionary.</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+
+  <span class="nd">@property</span>
+  <span class="nd">@abc.abstractmethod</span>
+  <span class="k">def</span> <span class="nf">name</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
+    <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    The name of the instance. Is useable as a dictionary key.</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+</pre></div>
+
+  </div>
+</div>
+
+
+      <div class="class">
+          <h3>Ancestors (in MRO)</h3>
+          <ul class="class_list">
+          <li><a href="/screwerk/supcon/util.m.md#supcon.util.Named">Named</a></li>
+          <li>abc.ABC</li>
+          <li>builtins.object</li>
+          </ul>
+          <h3>Instance variables</h3>
+            <div class="item">
+            <p id="supcon.util.Named.name" class="name">var <span class="ident">name</span></p>
+            
+
+            
+  
+    <div class="desc"><p>The name of the instance. Is useable as a dictionary key.</p></div>
+  <div class="source_cont">
+</div>
+
+            </div>
+      </div>
+      </div>
+      
+      <div class="item">
+      <p id="supcon.util.NamedList" class="name">class <span class="ident">NamedList</span></p>
+      
+  
+    <div class="desc"><p>A <a href="/screwerk/supcon/util.m.md#supcon.util.NamedList"><code>NamedList</code></a> is an ordered, readonly dictionary of
+<a href="/screwerk/supcon/util.m.md#supcon.util.Named"><code>Named</code></a> and <a href="/screwerk/supcon/util.m.md#supcon.util.Dumpable"><code>Dumpable</code></a> elements of value type
+<a href="/screwerk/supcon/util.m.md#supcon.util.NamedList.vtype"><code>vtype</code></a>.</p>
+<p>The class <a href="/screwerk/supcon/util.m.md#supcon.util.NamedList"><code>NamedList</code></a> itself can not be instantiated. It must be
+subclassed and the class property <a href="/screwerk/supcon/util.m.md#supcon.util.NamedList.vtype"><code>vtype</code></a> set. The class
+property <a href="/screwerk/supcon/util.m.md#supcon.util.NamedList.vtype"><code>vtype</code></a> denotes the type of the elements that
+the list can contain. The type <a href="/screwerk/supcon/util.m.md#supcon.util.NamedList.vtype"><code>vtype</code></a> must be a
+subclass of <a href="/screwerk/supcon/util.m.md#supcon.util.Named"><code>Named</code></a> and of <a href="/screwerk/supcon/util.m.md#supcon.util.Dumpable"><code>Dumpable</code></a>. Elements in the
+<a href="/screwerk/supcon/util.m.md#supcon.util.NamedList.vtype"><code>vtype</code></a> can be accessed by the values of their
+<a href="/screwerk/supcon/util.m.md#supcon.util.Named.name"><code>name</code></a> property.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.util.NamedList', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.util.NamedList" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">NamedList</span><span class="p">(</span><span class="n">collections</span><span class="o">.</span><span class="n">abc</span><span class="o">.</span><span class="n">Mapping</span><span class="p">,</span> <span class="n">Dumpable</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">  A `supcon.util.NamedList` is an ordered, readonly dictionary of</span>
+<span class="sd">  `supcon.util.Named` and `supcon.util.Dumpable` elements of value type</span>
+<span class="sd">  `supcon.util.NamedList.vtype`.</span>
+
+<span class="sd">  The class `supcon.util.NamedList` itself can not be instantiated. It must be</span>
+<span class="sd">  subclassed and the class property `supcon.util.NamedList.vtype` set. The class</span>
+<span class="sd">  property `supcon.util.NamedList.vtype` denotes the type of the elements that</span>
+<span class="sd">  the list can contain. The type `supcon.util.NamedList.vtype` must be a</span>
+<span class="sd">  subclass of `supcon.util.Named` and of `supcon.util.Dumpable`. Elements in the</span>
+<span class="sd">  `supcon.util.NamedList.vtype` can be accessed by the values of their</span>
+<span class="sd">  `supcon.util.Named.name` property.</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+
+  <span class="n">vtype</span> <span class="o">=</span> <span class="bp">None</span>
+  <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">  Must be assigned in a subclass of `supcon.util.NamedList` to a subclass</span>
+<span class="sd">  of `supcon.util.Named` and `supcon.util.Dumpable`</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+
+  <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">values</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    Initializes the `supcon.util.NamedList` with the given list of **values**.</span>
+
+<span class="sd">    An element of **values** must be of type `supcon.util.NamedList.vtype` or a</span>
+<span class="sd">    &#39;simple&#39; datastructure that can be converted to an instance of</span>
+<span class="sd">    `supcon.util.NamedList.vtype` by `supcon.util.NamedList.vtype`.load().</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">if</span> <span class="n">values</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+      <span class="n">values</span> <span class="o">=</span> <span class="p">[]</span>
+    <span class="k">if</span> <span class="ow">not</span> <span class="nb">issubclass</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="p">,</span> <span class="n">Named</span><span class="p">):</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;the value type must be a subclass of Named&#39;</span><span class="p">)</span>
+    <span class="k">if</span> <span class="ow">not</span> <span class="nb">issubclass</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="p">,</span> <span class="n">Dumpable</span><span class="p">):</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;the value type must be a subclass of Dumpable&#39;</span><span class="p">)</span>
+
+    <span class="bp">self</span><span class="o">.</span><span class="n">__values</span> <span class="o">=</span> <span class="n">collections</span><span class="o">.</span><span class="n">OrderedDict</span><span class="p">()</span>
+
+    <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">values</span><span class="p">:</span>
+      <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="p">):</span>
+        <span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+      <span class="k">if</span> <span class="n">value</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__values</span><span class="p">:</span>
+        <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;value.name must be unique in the given list of values&#39;</span><span class="p">)</span>
+      <span class="bp">self</span><span class="o">.</span><span class="n">__values</span><span class="p">[</span><span class="n">value</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
+
+  <span class="k">def</span> <span class="fm">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
+    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__values</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
+
+  <span class="k">def</span> <span class="fm">__iter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="k">return</span> <span class="nb">iter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__values</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="fm">__len__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__values</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="k">return</span> <span class="s2">&quot;{}.{}({})&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
+      <span class="bp">self</span><span class="o">.</span><span class="vm">__module__</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span>
+      <span class="s1">&#39;, &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="nb">repr</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">items</span><span class="p">()])</span>
+    <span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    Converts the `supcon.util.NamedList` into a list of &#39;simple&#39; datastructures.</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">return</span> <span class="p">[</span><span class="n">value</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span> <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()]</span>
+
+  <span class="nd">@classmethod</span>
+  <span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    Converts the given list of &#39;simple&#39; datastructures **data** into an instance</span>
+<span class="sd">    of **cls**, a subclass of `supcon.util.NamedList`.</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
+
+  <span class="nd">@classmethod</span>
+  <span class="k">def</span> <span class="nf">to</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    If the the **value** is an instance of **cls**, a subclass of</span>
+<span class="sd">    `supcon.util.NamedList`, the value is returned. If value is not an instance</span>
+<span class="sd">    of **cls** the method tries to convert the **value** into an instance of</span>
+<span class="sd">    **cls**.</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">return</span> <span class="n">value</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">cls</span><span class="p">)</span> <span class="k">else</span> <span class="bp">cls</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+
+      <div class="class">
+          <h3>Ancestors (in MRO)</h3>
+          <ul class="class_list">
+          <li><a href="/screwerk/supcon/util.m.md#supcon.util.NamedList">NamedList</a></li>
+          <li>collections.abc.Mapping</li>
+          <li>collections.abc.Collection</li>
+          <li>collections.abc.Sized</li>
+          <li>collections.abc.Iterable</li>
+          <li>collections.abc.Container</li>
+          <li><a href="/screwerk/supcon/util.m.md#supcon.util.Dumpable">Dumpable</a></li>
+          <li>abc.ABC</li>
+          <li>builtins.object</li>
+          </ul>
+          <h3>Class variables</h3>
+            <div class="item">
+            <p id="supcon.util.NamedList.vtype" class="name">var <span class="ident">vtype</span></p>
+            
+
+            
+  
+    <div class="desc"><p>Must be assigned in a subclass of <a href="/screwerk/supcon/util.m.md#supcon.util.NamedList"><code>NamedList</code></a> to a subclass
+of <a href="/screwerk/supcon/util.m.md#supcon.util.Named"><code>Named</code></a> and <a href="/screwerk/supcon/util.m.md#supcon.util.Dumpable"><code>Dumpable</code></a></p></div>
+  <div class="source_cont">
+</div>
+
+            </div>
+          <h3>Class Methods</h3>
+            
+  <div class="item">
+    <div class="name def" id="supcon.util.NamedList.load">
+    <p>def <span class="ident">load</span>(</p><p>cls, data)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Converts the given list of 'simple' datastructures <strong>data</strong> into an instance
+of <strong>cls</strong>, a subclass of <a href="/screwerk/supcon/util.m.md#supcon.util.NamedList"><code>NamedList</code></a>.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.util.NamedList.load', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.util.NamedList.load" class="source">
+    <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">  Converts the given list of &#39;simple&#39; datastructures **data** into an instance</span>
+<span class="sd">  of **cls**, a subclass of `supcon.util.NamedList`.</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.util.NamedList.to">
+    <p>def <span class="ident">to</span>(</p><p>cls, value)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>If the the <strong>value</strong> is an instance of <strong>cls</strong>, a subclass of
+<a href="/screwerk/supcon/util.m.md#supcon.util.NamedList"><code>NamedList</code></a>, the value is returned. If value is not an instance
+of <strong>cls</strong> the method tries to convert the <strong>value</strong> into an instance of
+<strong>cls</strong>.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.util.NamedList.to', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.util.NamedList.to" class="source">
+    <div class="codehilite"><pre><span></span><span class="nd">@classmethod</span>
+<span class="k">def</span> <span class="nf">to</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">  If the the **value** is an instance of **cls**, a subclass of</span>
+<span class="sd">  `supcon.util.NamedList`, the value is returned. If value is not an instance</span>
+<span class="sd">  of **cls** the method tries to convert the **value** into an instance of</span>
+<span class="sd">  **cls**.</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">return</span> <span class="n">value</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">cls</span><span class="p">)</span> <span class="k">else</span> <span class="bp">cls</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+          <h3>Methods</h3>
+            
+  <div class="item">
+    <div class="name def" id="supcon.util.NamedList.__init__">
+    <p>def <span class="ident">__init__</span>(</p><p>self, values=None)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Initializes the <a href="/screwerk/supcon/util.m.md#supcon.util.NamedList"><code>NamedList</code></a> with the given list of <strong>values</strong>.</p>
+<p>An element of <strong>values</strong> must be of type <a href="/screwerk/supcon/util.m.md#supcon.util.NamedList.vtype"><code>vtype</code></a> or a
+'simple' datastructure that can be converted to an instance of
+<a href="/screwerk/supcon/util.m.md#supcon.util.NamedList.vtype"><code>vtype</code></a> by <a href="/screwerk/supcon/util.m.md#supcon.util.NamedList.vtype"><code>vtype</code></a>.load().</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.util.NamedList.__init__', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.util.NamedList.__init__" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">values</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">  Initializes the `supcon.util.NamedList` with the given list of **values**.</span>
+<span class="sd">  An element of **values** must be of type `supcon.util.NamedList.vtype` or a</span>
+<span class="sd">  &#39;simple&#39; datastructure that can be converted to an instance of</span>
+<span class="sd">  `supcon.util.NamedList.vtype` by `supcon.util.NamedList.vtype`.load().</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">if</span> <span class="n">values</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+    <span class="n">values</span> <span class="o">=</span> <span class="p">[]</span>
+  <span class="k">if</span> <span class="ow">not</span> <span class="nb">issubclass</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="p">,</span> <span class="n">Named</span><span class="p">):</span>
+    <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;the value type must be a subclass of Named&#39;</span><span class="p">)</span>
+  <span class="k">if</span> <span class="ow">not</span> <span class="nb">issubclass</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="p">,</span> <span class="n">Dumpable</span><span class="p">):</span>
+    <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;the value type must be a subclass of Dumpable&#39;</span><span class="p">)</span>
+  <span class="bp">self</span><span class="o">.</span><span class="n">__values</span> <span class="o">=</span> <span class="n">collections</span><span class="o">.</span><span class="n">OrderedDict</span><span class="p">()</span>
+  <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">values</span><span class="p">:</span>
+    <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="p">):</span>
+      <span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">vtype</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+    <span class="k">if</span> <span class="n">value</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__values</span><span class="p">:</span>
+      <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;value.name must be unique in the given list of values&#39;</span><span class="p">)</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">__values</span><span class="p">[</span><span class="n">value</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.util.NamedList.dump">
+    <p>def <span class="ident">dump</span>(</p><p>self)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>Converts the <a href="/screwerk/supcon/util.m.md#supcon.util.NamedList"><code>NamedList</code></a> into a list of 'simple' datastructures.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.util.NamedList.dump', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.util.NamedList.dump" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">  Converts the `supcon.util.NamedList` into a list of &#39;simple&#39; datastructures.</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="k">return</span> <span class="p">[</span><span class="n">value</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span> <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()]</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.util.NamedList.get">
+    <p>def <span class="ident">get</span>(</p><p>self, key, default=None)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>D.get(k[,d]) -&gt; D[k] if k in D, else d.  d defaults to None.</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.util.NamedList.get', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.util.NamedList.get" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">get</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+    <span class="s1">&#39;D.get(k[,d]) -&gt; D[k] if k in D, else d.  d defaults to None.&#39;</span>
+    <span class="k">try</span><span class="p">:</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
+    <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
+        <span class="k">return</span> <span class="n">default</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.util.NamedList.items">
+    <p>def <span class="ident">items</span>(</p><p>self)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>D.items() -&gt; a set-like object providing a view on D's items</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.util.NamedList.items', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.util.NamedList.items" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">items</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="s2">&quot;D.items() -&gt; a set-like object providing a view on D&#39;s items&quot;</span>
+    <span class="k">return</span> <span class="n">ItemsView</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.util.NamedList.keys">
+    <p>def <span class="ident">keys</span>(</p><p>self)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>D.keys() -&gt; a set-like object providing a view on D's keys</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.util.NamedList.keys', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.util.NamedList.keys" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">keys</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="s2">&quot;D.keys() -&gt; a set-like object providing a view on D&#39;s keys&quot;</span>
+    <span class="k">return</span> <span class="n">KeysView</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+            
+  <div class="item">
+    <div class="name def" id="supcon.util.NamedList.values">
+    <p>def <span class="ident">values</span>(</p><p>self)</p>
+    </div>
+    
+
+    
+  
+    <div class="desc"><p>D.values() -&gt; an object providing a view on D's values</p></div>
+  <div class="source_cont">
+  <p class="source_link"><a href="javascript:void(0);" onclick="toggle('source-supcon.util.NamedList.values', this);">Show source &equiv;</a></p>
+  <div id="source-supcon.util.NamedList.values" class="source">
+    <div class="codehilite"><pre><span></span><span class="k">def</span> <span class="nf">values</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="s2">&quot;D.values() -&gt; an object providing a view on D&#39;s values&quot;</span>
+    <span class="k">return</span> <span class="n">ValuesView</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+</pre></div>
+
+  </div>
+</div>
+
+  </div>
+  
+      </div>
+      </div>
+
+  </section>
+
+    </article>
+</div>
diff --git a/listen.py b/listen.py
new file mode 100755 (executable)
index 0000000..ec50458
--- /dev/null
+++ b/listen.py
@@ -0,0 +1,30 @@
+#!/usr/bin/env python3
+
+import supcon.core
+
+from twisted.internet import reactor
+from twisted.internet.endpoints import TCP4ClientEndpoint
+
+local = 'listen'
+local = supcon.core.Node(local)
+
+printArgs = lambda *args: print(', '.join([ '{}'.format(i) for i in args ]))
+pluckArgs = lambda mapping, keys: (mapping[key] for key in keys)
+
+def onIntf(args, event):
+  (_Node, _Path, _Intf, eEvent) = event
+  (aNode, aPath, aInterface) = pluckArgs(args, ['node', 'path', 'intf'])
+  aInterface = supcon.intf.DInterface.load(aInterface)
+  for aEvent in aInterface.events:
+    reg = local.on if eEvent == 'intf' else local.off
+    reg(aNode, aPath, aInterface.name, aEvent, printArgs)
+
+local.on(local.name, '/', 'supcon.Local', 'intf', onIntf)
+local.on(local.name, '/', 'supcon.Local', 'intfLost', onIntf)
+
+local.on(local.name, '/', 'supcon.Local', 'intf', printArgs)
+local.on(local.name, '/', 'supcon.Local', 'intfLost', printArgs)
+
+local.connect(TCP4ClientEndpoint(reactor, 'localhost', 8123))
+
+reactor.run()
diff --git a/setup.py b/setup.py
new file mode 100644 (file)
index 0000000..061bbaf
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,39 @@
+# -*- coding: utf-8 -*-
+from setuptools import setup, find_packages
+
+#with open('README.rst') as f:
+#  readme = f.read()
+
+#with open('LICENSE') as f:
+#  license = f.read()
+
+install_requirements = [
+  'msgpack-python',
+  'twisted',
+  'pigpio',
+  'pyopenssl',
+  'service-identity',
+]
+development_requirements = [
+  'pdoc',
+  'pylint',
+  'pygments',
+]
+
+setup(
+  name='supcon',
+  version='0.0.1',
+  description='framework to access the supcon bus from python',
+#  long_description=readme,
+  long_description='',
+  author='Sebastian Brix',
+  author_email='sebastian.brix@graph-it.com',
+  url='git://git.graph-it.com/screwerk/supcon',
+#  license=license,
+  license='',
+  install_requires=install_requirements,
+  extras_require={
+    'dev': development_requirements
+  },
+  packages=find_packages(exclude=('doc')),
+)
diff --git a/supcon/__init__.py b/supcon/__init__.py
new file mode 100644 (file)
index 0000000..4ba52de
--- /dev/null
@@ -0,0 +1,94 @@
+# -*- coding: utf-8 -*-
+"""
+The `supcon` Framework provides inter-process communication (IPC) and remote
+procedure call (RPC) mechanisms, that allow communication between multiple
+computer programs running on different hosts in a TCP/IP network.
+
+Each participating program exposes one or more `supcon.intf.Node`s to the
+network. Each `supcon.intf.Node` has a name that must be unique among the
+nodes of the communicating programs.
+
+    #!python
+    import supcon.core
+    
+    lServer = supcon.core.Node('my-unique-server')
+    lClient = supcon.core.Node('my-unique-client')
+
+You can give a `supcon.intf.Node` one or more endpoints on the network to either
+connect to or to listen for incomming connections.
+
+    #!python
+    from twisted.internet import reactor
+    from twisted.internet.endpoints import TCP4ClientEndpoint
+    from twisted.internet.endpoints import TCP4ServerEndpoint
+
+    lServer.listen(TCP4ServerEndpoint(reactor, 7000))
+    lClient.connect(TCP4ClientEndpoint(reactor, 'localhost', 7000))
+
+When a `supcon.intf.Node` is unable to create a connection to the given endpoint
+or an established connection terminates, the node tries to reestablish the
+connection.
+
+Programs can expose events and provide methods via the node. These events and
+methods are defined in `supcon.intf.Interface`s. Lets create one:
+
+    #!python
+    import supcon.intf
+
+    timerIntf = supcon.intf.Interface({
+      'name': 'com.example.Timer',
+      'events': [
+        {
+          'name': 'timeout',
+          'args': [
+            { 'name': 'timer', 'description': '(str) - The name of the timer' }
+          ]
+          'description': 'Gets triggerd, whenever a timer times out.'
+        }
+      ],
+      'methods': [
+        {
+          'name': 'add',
+          'inArgs': [
+            { 'name': 'timer', 'description': '(str) - A name for the timer' }
+            { 'name': 'seconds', 'description': '(float) - A duration' }
+          ],
+          'description': 'Adds a new timer.'
+        }
+      ]
+    })
+
+Lets implement the interface and register the implementation at the local node:
+
+    #!python
+
+    timerImpl = supcon.intf.Implementation(timerIntf)
+    
+    def fireTimeout(timer):
+      timerImpl.fire('timeout', { 'timer': timer })
+    
+    def onAdd(timer, seconds):
+      reactor.callLater(seconds, lambda: fireTimeout(timer))
+
+    timerImpl.setCallCb('add', onAdd)
+
+    lServer.register('/myTimer', timerImpl)
+
+Now you can watch for timeout events and add a timer via the
+<code>lClient</code> reference:
+
+    #!python
+    lClient.on('my-unique-server', '/myTimer', 'com.example.Timer', 'timeout', 
+      lambda *args: print(', '.join([ '{}'.format(i) for i in args ]))
+    )
+
+    lClient.call('my-unique-server', '/myTimer', 'com.example.Timer', 'add', {
+      'timer': '5Seconds', 'seconds': 5
+    })
+
+And don't forget to start the reactor (aka event loop)
+
+    #!python
+    reactor.run()
+
+"""
diff --git a/supcon/clone.py b/supcon/clone.py
new file mode 100644 (file)
index 0000000..f0ce4a3
--- /dev/null
@@ -0,0 +1,89 @@
+# -*- coding: utf-8 -*-
+
+import supcon.intf
+
+class _Clone(supcon.intf.Implementation):
+
+  def __init__(self, local, rnode, rpath, interface):
+    super().__init__(interface)
+
+    self.__local = local
+    self.__rnode = rnode
+    self.__rpath = rpath
+
+    for event in self.interface.events:
+      self.__local.on(self.__rnode, self.__rpath, self.intf, event, self.__on)
+
+  def __del__(self):
+    for event in self.interface.events:
+      self.__local.off(self.__rnode, self.__rpath, self.intf, event, self.__on)
+
+  def __on(self, args: dict, event):
+    (_Node, _Path, _Intf, eEvent) = event
+    self.fire(eEvent, args)
+
+  def call(self, method, inArgs):
+    #print('_Clone.call', method, inArgs)
+    return self.__local.call(self.__rnode, self.__rpath, self.intf, method, inArgs)
+
+class Cloner(object):
+
+  def __init__(self, local: supcon.intf.Node, lPath: str, rNode: str, rPath: str, rIntf: str):
+    #print('Cloner.__init__')
+    self.__local = local
+    self.__lPath = lPath
+
+    self.__rNode = rNode
+    self.__rPath = rPath
+    self.__rIntf = rIntf
+
+    self.__impl = None
+
+    self.__local.on(self.__local.name, '/', 'supcon.Local', 'intf', self.__onIntf)
+    self.__local.on(self.__local.name, '/', 'supcon.Local', 'intfLost', self.__onIntf)
+
+    nodes = local.nodes()
+    if nodes.hasIntf(rNode, rPath, rIntf):
+      self.__setupImpl(nodes[rNode][rPath][rIntf])
+
+  @property
+  def local(self) -> supcon.intf.Node:
+    return self.__local
+
+  @property
+  def lPath(self) -> str:
+    return self.__lPath
+
+  @property
+  def rNode(self) -> str:
+    return self.__rNode
+
+  @property
+  def rPath(self) -> str:
+    return self.__rPath
+
+  @property
+  def rIntf(self) -> str:
+    return self.__rIntf
+
+  def __onIntf(self, args, event):
+    if args['node'] != self.__rNode or args['path'] != self.__rPath:
+      return
+    aInterface = supcon.intf.DInterface.load(args['intf'])
+    if aInterface.name != self.__rIntf:
+      return
+
+    if event[3] == 'intf':
+      self.__setupImpl(aInterface)
+    else:
+      self.__teardownImpl()
+
+  def __setupImpl(self, interface):
+    #print('Cloner.__setupImpl')
+    self.__impl = _Clone(self.__local, self.__rNode, self.__rPath, interface)
+    self.__local.register(self.__lPath, self.__impl)
+
+  def __teardownImpl(self):
+    self.__local.unregister(self.__lPath, self.__impl)
+    self.__impl = None
+
diff --git a/supcon/core.py b/supcon/core.py
new file mode 100644 (file)
index 0000000..3b68f24
--- /dev/null
@@ -0,0 +1,813 @@
+# -*- coding: utf-8 -*-
+"""
+This module provides the implementation of abstract class `supcon.intf.Node`.
+"""
+
+import sys
+import traceback
+
+import uuid
+import struct
+import msgpack
+
+import twisted.internet.defer as defer
+import twisted.internet.protocol
+import twisted.internet.endpoints
+
+import twisted.application.service
+import twisted.application.internet
+
+import supcon.intf
+
+_printArgs = lambda *args: print(', '.join(['{}'.format(i) for i in args]))
+
+LocalIntf = supcon.intf.DInterface.load({
+  'name': 'supcon.Local',
+  'events': [
+    {
+      'name': 'node',
+      'args': [
+        {'name': 'node', 'description': 'The node'},
+      ],
+    },
+    {
+      'name': 'nodeLost',
+      'args': [
+        {'name': 'node', 'description': 'The lost node'},
+      ],
+    },
+    {
+      'name': 'path',
+      'args': [
+        {'name': 'node', 'description': 'The node'},
+        {'name': 'path', 'description': 'The path'},
+      ],
+    },
+    {
+      'name': 'pathLost',
+      'args': [
+        {'name': 'node', 'description': 'The node'},
+        {'name': 'path', 'description': 'The path'},
+      ],
+    },
+    {
+      'name': 'intf',
+      'args': [
+        {'name': 'node', 'description': 'The node'},
+        {'name': 'path', 'description': 'The path'},
+        {'name': 'intf', 'description': 'The interface'},
+      ],
+    },
+    {
+      'name': 'intfLost',
+      'args': [
+        {'name': 'node', 'description': 'The node'},
+        {'name': 'path', 'description': 'The path'},
+        {'name': 'intf', 'description': 'The interface'},
+      ],
+    },
+  ],
+  'methods': [
+    {
+      'name': 'nodes',
+      'outArgs': [
+        {'name': 'nodes', 'description': 'A datastructure about all known nodes, paths and interfaces'},
+      ],
+    },
+  ],
+  'description': 'All methods and events are only locally available'
+})
+
+RemoteIntf = supcon.intf.DInterface.load({
+  'name': 'supcon.Remote',
+  'events': [
+    {
+      'name': 'intf',
+      'args': [
+        {'name': 'path', 'description': 'The path'},
+        {'name': 'intf', 'description': 'The interface'},
+      ],
+    },
+    {
+      'name': 'intfLost',
+      'args': [
+        {'name': 'path', 'description': 'The path'},
+        {'name': 'intf', 'description': 'The interface'},
+      ],
+    },
+  ],
+  'methods': [
+    {
+      'name': 'node',
+      'outArgs': [
+        {'name': 'node', 'description': 'A datastructure about all paths and interfaces of the node'},
+      ],
+    },
+    {
+      'name': 'on',
+      'inArgs': [
+        {'name': 'path', 'description': 'The path'},
+        {'name': 'intf', 'description': 'The interface'},
+        {'name': 'event', 'description': 'The event'},
+      ],
+    },
+    {
+      'name': 'off',
+      'inArgs': [
+        {'name': 'path', 'description': 'The path'},
+        {'name': 'intf', 'description': 'The interface'},
+        {'name': 'event', 'description': 'The event'},
+      ],
+    },
+  ],
+  'description': 'All methods and events are only used internally'
+})
+
+
+class _Protocol(twisted.internet.protocol.Protocol):
+  """This class handels handshake and message encoding between nodes on the bus.
+
+  This class is just an implementation detail of the class Node.
+  """
+  def __init__(self):
+    super().__init__()
+    self.factory = None
+
+    self.__data = bytearray()
+    self.__name = None
+
+  def connectionMade(self):
+    self.sendMesg({
+      'type': 'handshake',
+      'name': self.factory.name
+    })
+
+  def connectionLost(self, reason):
+    if not self.__name:
+      return
+    self.factory.delNode(self.__name)
+
+  def dataReceived(self, data):
+    self.__data.extend(data)
+
+    while len(self.__data) > 4:
+
+      size = struct.unpack_from('<L', self.__data)[0]
+      if len(self.__data) < size + 4:
+        break
+
+      mesg = self.__data[4:size + 4]
+      self.__data = self.__data[size + 4:]
+
+      try:
+        mesg = msgpack.unpackb(mesg, encoding='utf-8')
+      except BaseException as _:
+        self.transport.loseConnection()
+      else:
+        self.recvMesg(mesg)
+
+  def recvMesg(self, mesg):
+    if not self.__name:
+      if mesg['type'] != 'handshake':
+        self.transport.loseConnection()
+        return
+
+      self.__name = mesg['name']
+      self.factory.addNode(self.__name, self)
+    else:
+      self.factory.recvMesg(self.__name, mesg)
+
+  def sendMesg(self, mesg):
+    data = msgpack.packb(mesg, use_bin_type=True)
+    size = struct.pack('<L', len(data))
+
+    self.transport.write(size)
+    self.transport.write(data)
+
+
+class _Factory(twisted.internet.protocol.Factory):
+  """This class creates _Protocol instances for connections to remote nodes.
+
+  This class is just an implementation detail of the class Node and encapulates
+  methods to create the _Protocol instances resulting from calls to
+  Node.connect() and Node.listen().
+  """
+  protocol = _Protocol
+
+  def __init__(self, name, addNode, delNode, recvMesg):
+    self.name = name
+    self.addNode = addNode
+    self.delNode = delNode
+    self.recvMesg = recvMesg
+
+
+class _KnownMgr(object):
+
+  def __init__(self, fire):
+    self.__fire = fire
+
+    self.__nodes = supcon.intf.DNodes()
+
+  def addNode(self, node: str) -> bool:
+    if node in self.__nodes:
+      return True
+
+    self.__nodes = self.__nodes.addNode(node)
+
+    self.__fire('node', {'node': node})
+    return True
+
+  def delNode(self, node: str) -> bool:
+    if node not in self.__nodes:
+      return True
+
+    for path in self.__nodes[node]:
+      for intf in self.__nodes[node][path]:
+        self.delIntf(node, path, self.__nodes[node][path][intf])
+
+    self.__nodes = self.__nodes.delNode(node)
+    self.__fire('nodeLost', {'node': node})
+    return True
+
+  def addIntf(self, node: str, path: str, interface: supcon.intf.DInterface) -> bool:
+    #_printArgs('_KnownMgr.addIntf', node, path, interface)
+    if node not in self.__nodes:
+      return False
+
+    if path not in self.__nodes[node]:
+      self.__nodes = self.__nodes.addPath(node, path)
+      self.__fire('path', {'node': node, 'path': path})
+
+    if interface.name in self.__nodes[node][path]:
+      return True
+
+    self.__nodes = self.__nodes.addInterface(node, path, interface)
+    self.__fire('intf', {'node': node, 'path': path, 'intf': interface.dump()})
+    return True
+
+  def delIntf(self, node: str, path: str, interface: supcon.intf.DInterface) -> bool:
+    #_printArgs('_KnownMgr.delIntf', node, path, interface)
+    if not self.__nodes.hasIntf(node, path, interface.name):
+      return True
+
+    self.__nodes = self.__nodes.delInterface(node, path, interface)
+    self.__fire('intfLost', {'node': node, 'path': path, 'intf': interface.dump()})
+
+    if not self.__nodes[node][path]:
+      self.__nodes = self.__nodes.delPath(node, path)
+      self.__fire('pathLost', {'node': node, 'path': path})
+
+    return True
+
+  def getNode(self, node: str) -> supcon.intf.DNode:
+    if node in self.__nodes:
+      return self.__nodes[node]
+    return None
+
+  def setNode(self, newNode: supcon.intf.DNode):
+    #_printArgs('_KnownMgr.setNode', newNode.dump())
+    oldNode = self.getNode(newNode.name)
+
+    for oldPath in oldNode.values():
+      for oldIntf in oldPath.values():
+        if not newNode.hasIntf(oldPath.name, oldIntf.name):
+          self.delIntf(oldNode.name, oldPath.name, oldIntf)
+
+    for newPath in newNode.values():
+      for newIntf in newPath.values():
+        if not oldNode.hasIntf(newPath.name, newIntf.name):
+          self.addIntf(newNode.name, newPath.name, newIntf)
+
+  def getNodes(self) -> supcon.intf.DNodes:
+    return self.__nodes
+
+
+class _InformMgr(object):
+
+  def __init__(self):
+
+    self.__keys = {}
+    self.__nodes = {}
+
+  def on(self, path, intf, event, node):
+    key = (path, intf, event)
+
+    if key not in self.__nodes:
+      self.__nodes[key] = {}
+    self.__nodes[key][node] = True
+
+    if node not in self.__keys:
+      self.__keys[node] = {}
+    self.__keys[node][key] = True
+
+  def off(self, path, intf, event, node):
+    key = (path, intf, event)
+    if key not in self.__nodes or node not in self.__nodes[key]:
+      return
+
+    del self.__nodes[key][node]
+    if not self.__nodes[key]:
+      del self.__nodes[key]
+
+    del self.__keys[node][key]
+    if not self.__keys[node]:
+      del self.__keys[node]
+
+  def nodes(self, path, intf, event):
+    key = (path, intf, event)
+    if key not in self.__nodes:
+      return []
+    return self.__nodes[key].keys()
+
+  def delNode(self, node):
+    if node not in self.__keys:
+      return
+    for key in self.__keys[node]:
+      del self.__nodes[key][node]
+      if not self.__nodes[key]:
+        del self.__nodes[key]
+    del self.__keys[node]
+
+
+class _DeferredMgr(object):
+  """ This class manages Deferred """
+
+  def __init__(self):
+    self.__infos = {}
+
+  def create(self, data=None) -> (str, defer.Deferred):
+    """Creates a Deferred with an info.
+
+    Args:
+      data: Some additional data
+
+    Returns:
+      (str, defer.Deferred): A Tuple of an unique id and a Deferred
+    """
+    pid = str(uuid.uuid4())
+
+    def canceller(_d):
+      del self.__infos[pid]
+
+    d = defer.Deferred(canceller)
+    self.__infos[pid] = (d, data)
+
+    return (pid, d)
+
+  def succeed(self, value, pid):
+    """Succeeds the Deferred identified by the given unique id with the given
+    response.
+
+    Args:
+      pid (str): A unique id of a Deferred created with _DeferredMgr.create()
+      value (mixed): The value to succeed the Deferred with
+    """
+    if pid not in self.__infos:
+      return
+
+    d = self.__infos[pid][0]
+    del self.__infos[pid]
+    d.callback(value)
+
+  def fail(self, reason, pid):
+    """Fail the Deferred identified by the given unique id with the given
+    reason.
+
+    Args:
+      reason (Exception): The reason to fail the Deferred with
+      pid (str): A unique id of a Deferred created with _DeferredMgr.create()
+    """
+    if pid not in self.__infos:
+      return
+
+    d = self.__infos[pid][0]
+    del self.__infos[pid]
+    d.errback(reason)
+
+  def failAll(self, reason, predicate):
+    """Fail all Deferred for which predicate(data) returns true.
+
+    Args:
+      reason (Exception): The reason to fail the Deferred with
+      predicate (function): A predicate
+    """
+    for pid, info in self.__infos.copy().items():
+      if predicate(pid, info[1]):
+        del self.__infos[pid]
+        info[0].errback(reason)
+
+
+class _CallbackMgr(object):
+
+  def __init__(self):
+    self.__cbs = {}
+
+  def on(self, key, cb):
+    first = False
+    if key not in self.__cbs:
+      self.__cbs[key] = {}
+      first = True
+    self.__cbs[key][id(cb)] = cb
+    return first
+
+  def off(self, key, cb):
+    if key not in self.__cbs or id(cb) not in self.__cbs[key]:
+      return False
+    del self.__cbs[key][id(cb)]
+    if not self.__cbs[key]:
+      del self.__cbs[key]
+      return True
+    return False
+
+  def fire(self, key, args):
+    #_printArgs('_CallbackMgr.fire', key, args)
+    if key not in self.__cbs:
+      return
+    for cb in self.__cbs[key].values():
+      try:
+        cb(args, key)
+      except BaseException as _:
+        traceback.print_exc()
+
+  def keys(self, predicate):
+    return [key for key in self.__cbs if predicate(key)]
+
+
+class Node(supcon.intf.Node):
+
+  def __init__(self, name):
+    super().__init__(name)
+
+    self.__impls = {}
+    self.__protocols = {}
+
+    self.__factory = _Factory(self.name, self.__addNode, self.__delNode, self.__recvMesg)
+
+    self.__service = twisted.application.service.MultiService()
+    self.__service.startService()
+
+    fire = lambda event, args: \
+      self.__fireEventLocal(self.name, '/', LocalIntf.name, event, args)
+
+    self.__knownMgr = _KnownMgr(fire)
+    self.__informMgr = _InformMgr()
+    self.__callbackMgr = _CallbackMgr()
+    self.__deferredMgr = _DeferredMgr()
+
+    self.__knownMgr.addNode(self.name)
+
+  def connect(self, endpoint):
+    service = twisted.application.internet.ClientService(endpoint, self.__factory)
+    self.__service.addService(service)
+
+  def listen(self, endpoint):
+    endpoint.listen(self.__factory)
+
+  def __addNode(self, node: str, protocol: _Protocol):
+    if node in self.__protocols:
+      return False
+    self.__protocols[node] = protocol
+
+    self.__knownMgr.addNode(node)
+
+    # reestablish existing callbacks by calls to supcon.Remote.on
+    for key in self.__callbackMgr.keys(lambda key: key[0] == node):
+      self.__callRemote(node, '/', RemoteIntf.name, 'on', {
+        'path': key[1],
+        'intf': key[2],
+        'event': key[3]
+      })
+
+    self.__callRemote(node, '/', RemoteIntf.name, 'node', {}).addCallback(
+      lambda args: self.__knownMgr.setNode(supcon.intf.DNode.load(args['node']))
+    ).addErrback(_printArgs)
+
+    return True
+
+  def __delNode(self, node):
+    if node not in self.__protocols:
+      return False
+    del self.__protocols[node]
+
+    self.__knownMgr.delNode(node)
+    self.__informMgr.delNode(node)
+
+    reason = RuntimeError('node {} lost'.format(node))
+    predicate = lambda pid, data: data[0] == node
+    self.__deferredMgr.failAll(reason, predicate)
+
+    return True
+
+  def nodes(self):
+    return self.__knownMgr.getNodes()
+
+  def register(self, path: str, impl: supcon.intf.Implementation):
+    path = supcon.intf.DPath.toName(path)
+
+    if path not in self.__impls:
+      self.__impls[path] = {}
+
+    if impl.intf in self.__impls[path]:
+      raise ValueError('interface {} already registered at path {}'.format(impl.intf, path))
+
+    self.__impls[path][impl.intf] = {
+      'impl': impl,
+      'fire': lambda event, args: self.__fireImplEvent(path, impl.intf, event, args)
+    }
+    impl.addFireCb(self.__impls[path][impl.intf]['fire'])
+
+    self.__knownMgr.addIntf(self.name, path, impl.interface)
+    self.__broadcastEvent('intf', {'path': path, 'intf': impl.interface.dump()})
+
+  def unregister(self, path: str, impl: supcon.intf.Implementation):
+    path = supcon.intf.DPath.toName(path)
+
+    if path not in self.__impls:
+      raise ValueError('unknown path {}'.format(path))
+
+    if impl.intf not in self.__impls[path]:
+      raise ValueError('unknown interface {} at path {}'.format(impl.intf, path))
+
+    if impl != self.__impls[path][impl.intf]['impl']:
+      raise ValueError('unknown implementation for interface {} at path {}'.format(impl.intf, path))
+
+    impl.delFireCb(self.__impls[path][impl.intf]['fire'])
+    del self.__impls[path][impl.intf]
+
+    self.__knownMgr.delIntf(self.name, path, impl.interface)
+    self.__broadcastEvent('intfLost', {'path': path, 'intf': impl.interface.dump()})
+
+  def on(self, node, path, intf, event, cb):
+    if self.__callbackMgr.on((node, path, intf, event), cb):
+      if node != self.name and node in self.__protocols:
+        self.__callRemote(node, '/', RemoteIntf.name, 'on', {
+          'path': path, 'intf': intf, 'event': event
+        })
+
+  def off(self, node, path, intf, event, cb):
+    if self.__callbackMgr.off((node, path, intf, event), cb):
+      if node != self.name and node in self.__protocols:
+        self.__callRemote(node, '/', RemoteIntf.name, 'off', {
+          'path': path, 'intf': intf, 'event': event
+        })
+
+  def call(self, node, path, intf, method, args) -> defer.Deferred:
+    # TODO: don't raise Exceptions
+    assert path != '/' or intf != RemoteIntf.name, \
+      'unable to call: method {} of interface {} at path /'.format(method, RemoteIntf.name)
+
+    if node == self.name:
+      if path == '/' and intf == LocalIntf.name:
+        return self.__callLocal(method, args)
+      return self.__callImpl(path, intf, method, args)
+    return self.__callRemote(node, path, intf, method, args)
+
+  def __callImpl(self, path, intf, method, args) -> defer.Deferred:
+    # TODO: don't raise Exception
+    assert path != '/' or intf != LocalIntf.name, \
+      'unable to call impl: method {} of interface {} at path /'.format(method, LocalIntf.name)
+    assert path != '/' or intf != RemoteIntf.name, \
+      'unable to call impl: method {} of interface {} at path /'.format(method, RemoteIntf.name)
+
+    try:
+      if path not in self.__impls:
+        raise ValueError('unknown path') # TODO: nicer error message
+      if intf not in self.__impls[path]:
+        raise ValueError('unknown intf') # TODO: nicer error message
+      if method not in self.__impls[path][intf]['impl'].interface.methods:
+        raise ValueError('unknown method') # TODO: nicer error message
+
+      d = self.__impls[path][intf]['impl'].call(method, args)
+      if not isinstance(d, defer.Deferred):
+        d = defer.succeed(d)
+    except BaseException as e:
+      d = defer.fail(e)
+
+    return d
+
+  def __callLocal(self, method, args) -> defer.Deferred:
+    # TODO: don't raise Exception
+    assert method in LocalIntf.methods, \
+      '{} is not an method of interface {} at path /'.format(method, RemoteIntf.name)
+    LocalIntf.methods[method].validateInArgs(args)
+
+    if method == 'nodes':
+      return defer.succeed({'nodes': self.__knownMgr.getNodes().dump()})
+
+    return defer.fail(RuntimeError('method {} not yet implemented'.format(method)))
+
+  def __callRemote(self, node, path, intf, method, args) -> defer.Deferred:
+    # TODO: don't raise Exception
+    assert path != '/' or intf != LocalIntf.name, \
+      'unable to call remote: method {} of interface {} at path /'.format(method, LocalIntf.name)
+
+    # TODO: validate args
+
+    (cid, p) = self.__deferredMgr.create((node, path, intf, method))
+    self.__sendCall(node, path, intf, method, args, cid)
+    return p
+
+  def __fireImplEvent(self, path, intf, event, args):
+    assert path != '/' or intf != LocalIntf.name, \
+      'unable to fire impl: event {} of interface {} at path /'.format(event, RemoteIntf.name)
+    assert path != '/' or intf != RemoteIntf.name, \
+      'unable to fire impl: event {} of interface {} at path /'.format(event, RemoteIntf.name)
+
+    self.__fireEventLocal(self.name, path, intf, event, args)
+    self.__fireEventRemote(path, intf, event, args)
+
+  def __fireEventLocal(self, node: str, path: str, intf: str, event: str, args: dict):
+    assert path != '/' or intf != RemoteIntf.name, \
+      'unable to fire local: event {} of interface {} at path /'.format(event, RemoteIntf.name)
+    #_printArgs('Node.__fireEventLocal', node, path, intf, event, args)
+
+    # TODO: validate args
+
+    self.__callbackMgr.fire((node, path, intf, event), args)
+
+  def __fireEventRemote(self, path: str, intf: str, event: str, args: dict):
+    assert path != '/' or intf != LocalIntf.name, \
+      'unable to fire remote: event {} of interface {} at path /'.format(event, LocalIntf.name)
+
+    for node in self.__informMgr.nodes(path, intf, event):
+      self.__sendEvent(node, path, intf, event, args)
+
+  def __broadcastEvent(self, event: str, args: dict):
+    try:
+      assert event in RemoteIntf.events, \
+        '{} is not an event of interface {} at path /'.format(event, RemoteIntf.name)
+      RemoteIntf.events[event].validateArgs(args)
+    except BaseException as _:
+      traceback.print_exc()
+      return
+
+    for node in self.__protocols:
+      self.__sendEvent(node, '/', RemoteIntf.name, event, args)
+
+  def __recvMesg(self, node: str, mesg: dict):
+    """Gets called by _Protocol on new Message"""
+    if node not in self.__protocols:
+      return False
+
+    if mesg['type'] == 'call':
+      self.__recvCall(node, mesg['path'], mesg['intf'], mesg['name'], mesg['args'], mesg['id'])
+    elif mesg['type'] == 'error':
+      self.__recvError(node, mesg['args'], mesg['id'])
+    elif mesg['type'] == 'response':
+      self.__recvResult(node, mesg['args'], mesg['id'])
+    elif mesg['type'] == 'event':
+      self.__recvEvent(node, mesg['path'], mesg['intf'], mesg['name'], mesg['args'])
+    else:
+      return False
+
+    return True
+
+  def __recvCall(self, node: str, path: str, intf: str, method: str, args: dict, cid: str):
+    try:
+      assert path != '/' or intf != LocalIntf.name, \
+        'unable to recv call: method {} of interface {} at path / from node {}'.format(method, intf, node)
+
+      if path == '/' and intf == RemoteIntf.name:
+        assert method in RemoteIntf.methods, \
+          '{} is not an method of interface {} at path /'.format(method, RemoteIntf.name)
+        RemoteIntf.methods[method].validateInArgs(args)
+
+        if method == 'node':
+          d = defer.succeed({'node': self.__knownMgr.getNode(self.name).dump()})
+        elif method == 'on':
+          self.__informMgr.on(args['path'], args['intf'], args['event'], node)
+          d = defer.succeed({})
+        elif method == 'off':
+          self.__informMgr.on(args['path'], args['intf'], args['event'], node)
+          d = defer.succeed({})
+        else:
+          raise ValueError('method {} is not yet implemented'.format(method))
+      else:
+        d = self.__callImpl(path, intf, method, args)
+    except BaseException as e:
+      traceback.print_exc()
+      d = defer.fail(e)
+
+    d.addCallbacks(
+      lambda result: self.__sendResult(node, result, cid),
+      lambda reason: self.__sendError(node, repr(reason), cid)
+    ).addErrback(_printArgs)
+
+  def __recvError(self, _node: str, reason: str, cid: str):
+    try:
+      self.__deferredMgr.fail(RuntimeError(reason), cid)
+    except BaseException as _:
+      traceback.print_exc()
+
+  def __recvResult(self, _node: str, result: dict, cid: str):
+    try:
+      self.__deferredMgr.succeed(result, cid)
+    except BaseException as _:
+      traceback.print_exc()
+
+  def __recvEvent(self, node: str, path: str, intf: str, event: str, args: dict):
+    try:
+      assert path != '/' or intf != LocalIntf.name, \
+        'unable to recv event: event {} of interface {} at path /'.format(event, LocalIntf.name)
+
+      if path == '/' and intf == RemoteIntf.name:
+        assert event in RemoteIntf.events, \
+          '{} is not an event of interface {} at path /'.format(event, RemoteIntf.name)
+        RemoteIntf.events[event].validateArgs(args)
+
+        self.__recvEventRemote(node, event, args)
+      else:
+        self.__fireEventLocal(node, path, intf, event, args)
+    except BaseException as _:
+      traceback.print_exc()
+
+  def __recvEventRemote(self, node, event, args):
+    if event == 'intf':
+      path = args['path']
+      interface = supcon.intf.DInterface.load(args['intf'])
+
+      self.__knownMgr.addIntf(node, path, interface)
+
+    elif event == 'intfLost':
+      path = args['path']
+      interface = supcon.intf.DInterface.load(args['intf'])
+
+      self.__knownMgr.delIntf(node, path, interface)
+
+      reason = RuntimeError('interface {} at path {} on node {} lost'.format(node, path, interface.name))
+      predicate = lambda pid, data: data[0] == node and data[1] == path and data[2] == interface.name
+      self.__deferredMgr.failAll(reason, predicate)
+
+    else:
+      raise ValueError('event {} not yet implemented'.format(event))
+
+  def __sendCall(self, node: str, path: str, intf: str, method: str, args: dict, cid: str) -> bool:
+    try:
+      assert path != '/' or intf != LocalIntf.name, \
+        'unable to send call: method {} of interface {} at path /'.format(method, LocalIntf.name)
+      if node not in self.__protocols:
+        raise RuntimeError('unknown node {}'.format(node))
+
+      self.__protocols[node].sendMesg({
+        'type': 'call',
+        'path': path,
+        'intf': intf,
+        'name': method,
+        'args': args,
+        'id': cid
+      })
+      return True
+    except BaseException as _:
+      traceback.print_exc()
+      return False
+
+  def __sendError(self, node: str, reason: str, cid: str) -> bool:
+    try:
+      if node not in self.__protocols:
+        raise RuntimeError('unknown node {}'.format(node))
+
+      self.__protocols[node].sendMesg({
+        'type': 'error',
+        'args': reason,
+        'id': cid
+      })
+      return True
+    except BaseException as _:
+      traceback.print_exc()
+      return False
+
+  def __sendResult(self, node: str, result: dict, cid: str) -> bool:
+    try:
+      if node not in self.__protocols:
+        raise RuntimeError('unknown node {}'.format(node))
+
+      self.__protocols[node].sendMesg({
+        'type': 'response',
+        'args': result,
+        'id': cid
+      })
+      return True
+    except BaseException as _:
+      traceback.print_exc()
+      return False
+
+  def __sendEvent(self, node: str, path: str, intf: str, event: str, args: dict) -> bool:
+    try:
+      assert path != '/' or intf != LocalIntf.name, \
+        'unable to send event: event {} of interface {} at path /'.format(event, LocalIntf.name)
+      if node not in self.__protocols:
+        traceback.print_stack()
+        raise RuntimeError('unknown node {}'.format(node))
+
+      self.__protocols[node].sendMesg({
+        'type': 'event',
+        'path': path,
+        'intf': intf,
+        'name': event,
+        'args': args
+      })
+      return True
+    except BaseException as _:
+      exc_info = sys.exc_info()
+      traceback.print_exception(*exc_info)
+      return False
diff --git a/supcon/graph.py b/supcon/graph.py
new file mode 100644 (file)
index 0000000..e6b7b0f
--- /dev/null
@@ -0,0 +1,144 @@
+
+
+import struct
+import msgpack
+
+import twisted.internet.defer as defer
+import twisted.internet.interfaces
+import twisted.internet.protocol
+
+class _Protocol(twisted.internet.protocol.Protocol):
+
+  def __init__(self):
+    super().__init__()
+    self.factory = None
+
+    self.__data = bytearray()
+    self.__name = None
+
+  def dataReceived(self, data):
+    self.__data.extend(data)
+
+    while len(self.__data) > 4:
+
+      size = struct.unpack_from('<L', self.__data)[0]
+      if len(self.__data) < size + 4:
+        break
+
+      mesg = self.__data[4:size + 4]
+      self.__data = self.__data[size + 4:]
+
+      try:
+        mesg = msgpack.unpackb(mesg)
+      except BaseException as e:
+        self.factory.close(e)
+      else:
+        self.factory.recv(mesg)
+
+  def send(self, mesg):
+    data = msgpack.packb(mesg)
+    size = struct.pack('<L', len(data))
+
+    self.transport.write(size)
+    self.transport.write(data)
+
+  def close(self):
+    self.transport.loseConnection()
+
+class _Factory(twisted.internet.protocol.Factory):
+  protocol = _Protocol
+
+  def __init__(self, recv, close):
+    self.__recv = recv
+    self.__close = close
+
+  @property
+  def recv(self):
+    return self.__recv
+
+  @property
+  def close(self):
+    return self.__close
+
+
+class Connection(object):
+
+  def __init__(self, point: twisted.internet.interfaces.IStreamClientEndpoint):
+    self.__point = point
+
+    self.__lock = defer.DeferredLock()
+    self.__factory = _Factory(self.__recv, self.__close)
+
+    self.__proto = None
+    self.__callid = 0
+
+    self.__deferred = None
+
+  def __del__(self):
+    self.__close()
+
+  @defer.inlineCallbacks
+  def __open(self):
+    self.__proto = yield self.__point.connect(self.__factory)
+    yield self.__read()
+
+  def __close(self, reason=None):
+    if self.__proto:
+      self.__proto.close()
+      self.__proto = None
+
+    self.__callid = 0
+
+    if self.__deferred:
+      d = self.__deferred
+      self.__deferred = None
+      d.errback(reason)
+
+  def __read(self):
+    if self.__deferred:
+      raise RuntimeError('Already reading???')
+    self.__deferred = defer.Deferred()
+    return self.__deferred
+
+  def __recv(self, mesg):
+    if not self.__deferred:
+      raise RuntimeError('Not reading???')
+    d = self.__deferred
+    self.__deferred = None
+    d.callback(mesg)
+
+  def __write(self, mesg):
+    self.__proto.send(mesg)
+
+  @defer.inlineCallbacks
+  def __call(self, method, params):
+    yield self.__lock.acquire()
+
+    try:
+      if self.__callid == 0:
+        yield self.__open()
+      self.__callid += 1
+
+      req = {
+        b'jsonrpc': b'2.0',
+        b'method': method,
+        b'params': params,
+        b'id': self.__callid,
+      }
+      self.__write(req)
+
+      res = yield self.__read()
+    finally:
+      self.__lock.release()
+
+    if b'jsonrpc' not in res or res[b'jsonrpc'] != req[b'jsonrpc']:
+      raise Exception('Not a JSON-RPC 2.0 response!')
+    if b'error' in res:
+      raise Exception('JSON-RPC: Remote error: {0}'.format(res[b'error']))
+    if b'id' not in res or res[b'id'] != req[b'id']:
+      raise Exception('JSON-RPC id missing or invalid')
+
+    return res[b'result']
+
+  def __getattr__(self, attr):
+    return lambda *args: self.__call(attr, args)
diff --git a/supcon/intf.py b/supcon/intf.py
new file mode 100644 (file)
index 0000000..69d2ce6
--- /dev/null
@@ -0,0 +1,742 @@
+# -*- coding: utf-8 -*-
+"""
+This module contains the classes to describe interfaces on the supcon bus,
+a base class `supcon.intf.Implementation` to implemet those interfaces and the
+abstract class `supcon.intf.Node` which contains methods to interact with the
+supcon bus.
+"""
+
+import re
+import abc
+import itertools
+import traceback
+
+import twisted.internet.defer as defer
+
+import supcon.util
+
+class Named(supcon.util.Named):
+  """A base class for objects with a name.
+  """
+
+  regex = None
+  """re.RegexObject: a regular expression, the name must conform to"""
+
+  def __init__(self, name):
+    """Initializes the NamedAndDescribed instance
+
+    Args:
+      name (str): the name of the argument
+    """
+    self.__name = self.toName(name)
+
+  @property
+  def name(self) -> str:
+    """str: the name"""
+    return self.__name
+
+  @classmethod
+  def toName(cls, value) -> str:
+    """Converts the value into a name. If this is impossible a ValueError is
+    raised.
+
+    Args:
+      value (any): the value
+    Raises:
+      ValueError
+    """
+    value = str(value)
+    if not cls.regex.fullmatch(value):
+      raise ValueError("value {} must match {} fully".format(value, cls.regex.pattern))
+    return value
+
+
+class NamedAndDescribed(Named):
+  """A base class for the interface describing classes `supcon.intf.Argument`,
+  `supcon.intf.Event`, `supcon.intf.Method` and `supcon.intf.Interface` that
+  all have the properties name and description."""
+
+  def __init__(self, name, description=''):
+    """Initializes the NamedAndDescribed instance
+
+    Args:
+      name (str): the name of the argument
+      description (str): a description of the argument
+    """
+    Named.__init__(self, name)
+    self.__description = self.toDescription(description)
+
+  @property
+  def description(self) -> str:
+    """str: a description"""
+    return self.__description
+
+  @classmethod
+  def toDescription(cls, value) -> str:
+    """Converts the value into a description. If this is impossible a ValueError
+    is raised.
+
+    Args:
+      value (any): the value
+    Raises:
+      ValueError
+    """
+    return str(value)
+
+
+class DArgument(supcon.util.Dumpable, NamedAndDescribed):
+  """Describes an input or output argument of a `supcon.intf.DMethod` or an
+  argument of a `supcon.intf.DEvent`"""
+
+  regex = re.compile('[a-zA-Z0-9]+')
+
+  def validate(self, argument):
+    """Validates the given argument value. Raises an ValueError if validation
+    fails.
+    """
+    pass
+
+  def dump(self):
+    data = {'name': self.name}
+    if self.description != '':
+      data['description'] = self.description
+    return data
+
+  @classmethod
+  def load(cls, data):
+    return cls(**data)
+
+
+class DArguments(supcon.util.NamedList):
+  """A readonly map of `supcon.intf.DArgument` instances"""
+  vtype = DArgument
+
+
+class DEvent(supcon.util.Dumpable, NamedAndDescribed):
+  """Describes an event that can be emitted by an implementation on the bus"""
+
+  regex = re.compile('[a-zA-Z0-9]+')
+
+  def __init__(self, name, args=DArguments(), description=''):
+    """Initializes the Event
+
+    Args:
+      name (str): the name of the event
+      args (DArguments): the list of arguments of the event
+      description (str): a description of the event
+    """
+    NamedAndDescribed.__init__(self, name, description)
+    self.__args = DArguments.to(args)
+
+  @property
+  def args(self) -> DArguments:
+    """DArguments: the list of arguments of the event"""
+    return self.__args
+
+  def validateArgs(self, args):
+    """Validates the given argument map. Raises an ValueError if validation
+    fails.
+    """
+    for arg in args:
+      if arg not in self.__args:
+        raise ValueError('event {} has no argument {}'.format(self.name, arg))
+      self.__args[arg].validate(args[arg])
+    for arg in self.__args:
+      if arg not in args:
+        raise ValueError('event {} needs argument {}'.format(self.name, arg))
+
+  def dump(self):
+    data = {'name': self.name}
+    if self.args:
+      data['args'] = self.args.dump()
+    if self.description != '':
+      data['description'] = self.description
+    return data
+
+  @classmethod
+  def load(cls, data):
+    return cls(**data)
+
+
+class DEvents(supcon.util.NamedList):
+  """A readonly map of `supcon.intf.DEvent` instances"""
+  vtype = DEvent
+
+
+class DMethod(supcon.util.Dumpable, NamedAndDescribed):
+  """A DMethod that can be called on an Object on the Bus"""
+
+  regex = re.compile('[a-zA-Z0-9]+')
+
+  def __init__(self, name, inArgs=DArguments(), outArgs=DArguments(), description=''):
+    """Initializes the Event
+
+    Args:
+      name (str): the name of the method
+      inArgs (DArguments): the list of input arguments of the method
+      outArgs (DArguments): the list of output arguments of the method
+      description (str): a description of the method
+    """
+    NamedAndDescribed.__init__(self, name, description)
+    self.__inArgs = DArguments.to(inArgs)#
+    self.__outArgs = DArguments.to(outArgs)
+
+  @property
+  def inArgs(self) -> DArguments:
+    """DArguments: The input arguments of the method"""
+    return self.__inArgs
+
+  @property
+  def outArgs(self) -> DArguments:
+    """DArguments: The output arguments of the method"""
+    return self.__outArgs
+
+  def validateInArgs(self, inArgs):
+    """Validates the given argument Mapping. Raises an ValueError if validation fails
+    """
+    for arg in inArgs:
+      if arg not in self.__inArgs:
+        raise ValueError('method {} has no input argument {}'.format(self.name, arg))
+      self.__inArgs[arg].validate(inArgs[arg])
+    for arg in self.__inArgs:
+      if arg not in inArgs:
+        raise ValueError('method {} needs input argument {}'.format(self.name, arg))
+
+  def validateOutArgs(self, outArgs):
+    """Validates the given argument Mapping. Raises an ValueError if validation fails
+    """
+    for arg in outArgs:
+      if arg not in self.__outArgs:
+        raise ValueError('method {} has no output argument {}'.format(self.name, arg))
+      self.__outArgs[arg].validate(outArgs[arg])
+    for arg in self.__outArgs:
+      if arg not in outArgs:
+        raise ValueError('method {} needs output argument {}'.format(self.name, arg))
+
+  def dump(self):
+    data = {'name': self.name}
+    if self.inArgs:
+      data['inArgs'] = self.inArgs.dump()
+    if self.outArgs:
+      data['outArgs'] = self.outArgs.dump()
+    if self.description != '':
+      data['description'] = self.description
+    return data
+
+  @classmethod
+  def load(cls, data):
+    return cls(**data)
+
+
+class DMethods(supcon.util.NamedList):
+  """A readonly map of `supcon.intf.DMethod` instances"""
+  vtype = DMethod
+
+
+class DInterface(supcon.util.Dumpable, NamedAndDescribed):
+  """An Interface that is implemented by an Object on the Bus"""
+
+  regex = re.compile('([a-zA-Z0-9_]+\\.)*[a-zA-Z0-9_]+')
+
+  def __init__(self, name, events=DEvents(), methods=DMethods(), description=''):
+    """Initializes the Event
+
+    Args:
+      name (str): the name of the interface
+      events (DEvents): the list of events of the interface
+      methods (DMethods): the list of methods of the interface
+      description (str): a description of the interface
+    """
+    NamedAndDescribed.__init__(self, name, description)
+    self.__events = DEvents.to(events)
+    self.__methods = DMethods.to(methods)
+
+  @property
+  def events(self) -> DEvents:
+    """DEvent: the list of events this interface can emit"""
+    return self.__events
+
+  @property
+  def methods(self) -> DMethods:
+    """DMethods: the list of methods this interface provides"""
+    return self.__methods
+
+  def validateEvent(self, event, args):
+    """Validates that the given event is an event of this interface and that
+    the given arguments are arguments of the event
+
+    Args:
+      event (str): the event
+      args (dict): the arguments
+    Raises:
+      ValueError
+    """
+    event = str(event)
+    if event not in self.__events:
+      raise ValueError('event {} is unknown'.format(event))
+    self.__events[event].validateArgs(args)
+
+  def validateCall(self, method, inArgs):
+    """Asserts that the given method is a method of this interface and that
+    the given arguments are input arguments of the method
+
+    Args:
+      event (str): the event
+      inArgs (dict): the input arguments
+    Raises:
+      AssertationError
+    """
+    method = str(method)
+    if method not in self.__methods:
+      raise ValueError('method {} is unknown'.format(method))
+    self.__methods[method].validateInArgs(inArgs)
+
+  def validateReturn(self, method, outArgs):
+    """Asserts that the given method is a method of this interface and that
+    the given arguments are output arguments of the method
+
+    Args:
+      event (str): the event
+      outArgs (dict): the output arguments
+    Raises:
+      AssertationError
+    """
+    method = str(method)
+    if method not in self.__methods:
+      raise ValueError('method {} is unknown'.format(method))
+    self.__methods[method].validateOutArgs(outArgs)
+
+  def dump(self):
+    data = {'name': self.name}
+    if self.events:
+      data['events'] = self.events.dump()
+    if self.methods:
+      data['methods'] = self.methods.dump()
+    if self.description != '':
+      data['description'] = self.description
+    return data
+
+  @classmethod
+  def load(cls, data):
+    return cls(**data)
+
+
+class DInterfaces(supcon.util.NamedList):
+  """A readonly map of `supcon.intf.DInterface` instances"""
+  vtype = DInterface
+
+
+class DPath(Named, supcon.util.NamedList):
+  """A named readonly map of `supcon.intf.DInterface` instances"""
+
+  vtype = DInterface
+  regex = re.compile('/(([a-zA-Z0-9_]+/)*[a-zA-Z0-9_]+)?')
+
+  def __init__(self, name, interfaces=None):
+    """Initializes the Path instance
+
+    Args:
+      name (str): the name of the argument
+      interfaces (): ...
+    """
+    if interfaces is None:
+      interfaces = []
+    Named.__init__(self, name)
+    supcon.util.NamedList.__init__(self, interfaces)
+
+  def dump(self):
+    return {
+      'name': self.name,
+      'interfaces': [value.dump() for value in self.values()]
+    }
+
+  @classmethod
+  def load(cls, data) -> 'DPath':
+    return cls(**data)
+
+  def addInterface(self, interface: DInterface) -> 'DPath':
+    if interface.name in self:
+      raise ValueError('interface {} at path {} already exists'.format(interface.name, self.name))
+    interfaces = itertools.chain(self.values(), [interface])
+    return DPath(self.name, interfaces)
+
+  def delInterface(self, interface: DInterface) -> 'DPath':
+    if interface.name not in self:
+      raise ValueError('interface {} at path {} does not exist'.format(interface.name, self.name))
+    interfaces = (v for v in self.values() if v.name != interface.name)
+    return DPath(self.name, interfaces)
+
+
+class DNode(Named, supcon.util.NamedList):
+  """A named readonly map of `supcon.intf.DPath` instances"""
+
+  vtype = DPath
+  regex = re.compile('.+')
+
+  def __init__(self, name, paths=None):
+    """Initializes the Path instance
+
+    Args:
+      name (str): the name of the argument
+      paths (): ...
+    """
+    if paths is None:
+      paths = []
+
+    Named.__init__(self, name)
+    supcon.util.NamedList.__init__(self, paths)
+
+  def dump(self):
+    return {
+      'name': self.name,
+      'paths': [value.dump() for value in self.values()]
+    }
+
+  @classmethod
+  def load(cls, data) -> 'DPath':
+    return cls(**data)
+
+  def hasPath(self, path: str) -> bool:
+    return path in self
+
+  def hasIntf(self, path: str, intf: str) -> bool:
+    return path in self and intf in self[path]
+
+  def addPath(self, path: str) -> 'DNode':
+    if path in self:
+      raise ValueError('path {} on node {} already exists'.format(path, self.name))
+    paths = itertools.chain(self.values(), [DPath(path)])
+    return DNode(self.name, paths)
+
+  def delPath(self, path: str) -> 'DNode':
+    if path not in self:
+      raise ValueError('path {} on node {} does not exist'.format(path, self.name))
+    if self[path]:
+      raise ValueError('path {} on node {} is not empty'.format(path, self.name))
+    paths = (v for v in self.values() if v.name != path)
+    return DNode(self.name, paths)
+
+  def addInterface(self, path: str, interface: DInterface) -> 'DNode':
+    if path not in self:
+      raise ValueError('path {} on node {} does not exist'.format(path, self.name))
+    if interface.name in self[path]:
+      raise ValueError('interface {} at path {} on node {} already exists'.format(interface.name, path, self.name))
+    paths = (v for v in self.values() if v.name != path)
+    paths = itertools.chain(paths, [self[path].addInterface(interface)])
+    return DNode(self.name, paths)
+
+  def delInterface(self, path: str, interface: DInterface) -> 'DNode':
+    if path not in self:
+      raise ValueError('path {} on node {} does not exist'.format(path, self.name))
+    if interface.name not in self[path]:
+      raise ValueError('interface {} at path {} on node {} does not exist'.format(interface.name, path, self.name))
+    paths = (v for v in self.values() if v.name != path)
+    paths = itertools.chain(paths, [self[path].delInterface(interface)])
+    return DNode(self.name, paths)
+
+
+class DNodes(supcon.util.NamedList):
+  """A readonly map of `supcon.intf.DNode` instances"""
+  vtype = DNode
+
+  def hasNode(self, node: str) -> bool:
+    return node in self
+
+  def hasPath(self, node: str, path: str) -> bool:
+    return node in self and path in self[node]
+
+  def hasIntf(self, node: str, path: str, intf: str) -> bool:
+    return node in self and path in self[node] and intf in self[node][path]
+
+  def addNode(self, node: str) -> 'DNodes':
+    if node in self:
+      raise ValueError('node {} already exists'.format(node))
+    nodes = itertools.chain(self.values(), [DNode(node)])
+    return DNodes(nodes)
+
+  def delNode(self, node: str) -> 'DNodes':
+    if node not in self:
+      raise ValueError('node {} does not exist'.format(node))
+    if self[node]:
+      raise ValueError('node {} is not empty'.format(node))
+    nodes = (v for v in self.values() if v.name != node)
+    return DNodes(nodes)
+
+  def addPath(self, node: str, path: str) -> 'DNodes':
+    if node not in self:
+      raise ValueError('node {} does not exist'.format(node))
+    nodes = (v for v in self.values() if v.name != node)
+    nodes = itertools.chain(nodes, [self[node].addPath(path)])
+    return DNodes(nodes)
+
+  def delPath(self, node: str, path: str) -> 'DNodes':
+    if node not in self:
+      raise ValueError('node {} does not exist'.format(node))
+    nodes = (v for v in self.values() if v.name != node)
+    nodes = itertools.chain(nodes, [self[node].delPath(path)])
+    return DNodes(nodes)
+
+  def addInterface(self, node: str, path: str, interface: DInterface) -> 'DNodes':
+    if node not in self:
+      raise ValueError('node {} does not exist'.format(node))
+    nodes = (v for v in self.values() if v.name != node)
+    nodes = itertools.chain(nodes, [self[node].addInterface(path, interface)])
+    return DNodes(nodes)
+
+  def delInterface(self, node: str, path: str, interface: DInterface) -> 'DNodes':
+    if node not in self:
+      raise ValueError('node {} does not exist'.format(node))
+    nodes = (v for v in self.values() if v.name != node)
+    nodes = itertools.chain(nodes, [self[node].delInterface(path, interface)])
+    return DNodes(nodes)
+
+
+class Implementation(object):
+  """The base class for interface implementations"""
+
+  def __init__(self, interface: DInterface):
+    """
+    Args:
+      interface (DInterface): the interface that is implemented by this Implementation
+    """
+    if not isinstance(interface, DInterface):
+      raise ValueError('interface must be an instance of {}'.format(DInterface))
+    self.__interface = interface
+
+    self.__callCbs = {}
+    self.__fireCbs = []
+
+  @property
+  def intf(self) -> str:
+    """str: The name of the implemented interface"""
+    return self.__interface.name
+
+  @property
+  def interface(self) -> DInterface:
+    """Interface: The implemented interface"""
+    return self.__interface
+
+  def setCallCb(self, method: str, cb):
+    """Sets a callback for the given method. The method must be a method of the
+    interface this Implementation implements. The callback must implement the
+    given method. The callback gets called by calls to Implementation.call()
+
+    Args:
+      method (str): the interface method that the callback implements
+      cb (callable): the callback
+    """
+    method = DMethod.toName(method)
+    if method in self.__callCbs:
+      raise ValueError('Callback for method {} is already set!'.format(method))
+    if method not in self.__interface.methods:
+      raise ValueError('Interface has no method {}!'.format(method))
+    self.__callCbs[method] = cb
+
+  def call(self, method: str, inArgs) -> defer.Deferred:
+    """Calls the given interface method with the given arguments. This method
+    calls the callback set by Implementation.setCallCb()
+
+    Args:
+      method (str): the called interface method
+      inArgs (Mapping): a map of input arguments
+    Returns:
+      defer.Deferred: Resolves with the result of the called method
+    """
+    def validateReturn(outArgs):
+      try:
+        self.__interface.validateReturn(method, outArgs)
+      except:
+        traceback.print_exc()
+        raise
+      return outArgs
+
+    try:
+      self.__interface.validateCall(method, inArgs)
+      if method not in self.__callCbs:
+        raise ValueError('Callback for method {} is not set!'.format(method))
+
+      d = self.__callCbs[method](**inArgs)
+      if not isinstance(d, defer.Deferred):
+        d = defer.succeed(d)
+      d.addCallback(validateReturn)
+    except BaseException as e:
+      traceback.print_exc()
+      d = defer.fail(e)
+
+    return d
+
+  def addFireCb(self, cb):
+    """Adds a callback that gets called, when this Implementation fires an
+    event.
+
+    Args:
+      cb (callable): the callback
+    """
+    self.__fireCbs.append(cb)
+
+  def delFireCb(self, cb):
+    """Removes a callback that gets called, when this Implementation fires an
+    event.
+
+    Args:
+      cb (callable): the callback
+    """
+    self.__fireCbs.remove(cb)
+
+  def fire(self, event: str, args):
+    """Fires the given event with the given arguments.
+
+    Args:
+      event (str): the event name
+      args (collecion.Mapping): the event arguments
+    """
+    self.__interface.validateEvent(event, args)
+
+    for cb in self.__fireCbs:
+      cb(event, args)
+
+
+class Object(object):
+
+  def __init__(self, interfaces=None):
+    """
+    Args:
+      interfaces (DInterfaces): the interfaces that are implemented by this Object
+    """
+    if interfaces is None:
+      interfaces = []
+
+    self.__intfs = {}
+    self.__impls = {}
+
+    for interface in interfaces:
+      if not isinstance(interface, DInterface):
+        raise ValueError('interface must be an instance of {}'.format(DInterface))
+      self.__intfs[interface.name] = interface
+
+      implementation = Implementation(interface)
+      self.__impls[implementation.intf] = implementation
+
+  @property
+  def interfaces(self):
+    return self.__intfs.values()
+
+  @property
+  def implementations(self):
+    return self.__impls.values()
+
+  def interface(self, intf):
+    return self.__intfs[intf]
+
+  def implementation(self, intf):
+    return self.__impls[intf]
+
+  def setCallCb(self, intf: str, method: str, cb):
+    self.__impls[intf].setCallCb(method, cb)
+
+  def fire(self, intf: str, event: str, args):
+    self.__impls[intf].fire(event, args)
+
+
+class Node(abc.ABC):
+  """The Node Interface. This class defines the methods that participants can
+  use to access the supcon bus."""
+
+  def __init__(self, name):
+    super().__init__()
+    self.__name = self.toName(name)
+
+  @property
+  def name(self) -> str:
+    """str: The name of the node on the bus"""
+    return self.__name
+
+  @classmethod
+  def toName(cls, value) -> str:
+    return DNode.toName(value)
+
+  @abc.abstractmethod
+  def nodes(self) -> DNodes:
+    """list[str]: The currently connected nodes"""
+    raise NotImplementedError()
+
+  @abc.abstractmethod
+  def connect(self, endpoint):
+    """Connects the node to the given endpoint.
+
+    If the connection failes or closes the connection gets reestablished with an
+    exponential timeout up to two minutes.
+
+    Args:
+      endpoint (twisted.internet.interfaces.IStreamClientEndpoint):
+    """
+    raise NotImplementedError()
+
+  @abc.abstractmethod
+  def listen(self, endpoint):
+    """Listens at the given endpoint for incoming connections
+
+    Args:
+      endpoint (twisted.internet.interfaces.IStreamServerEndpoint):
+    """
+    raise NotImplementedError()
+
+  @abc.abstractmethod
+  def register(self, path: str, impl: Implementation):
+    """Registers an implementation with the node
+
+    Args:
+      impl (Implementation):
+    """
+    raise NotImplementedError()
+
+  @abc.abstractmethod
+  def unregister(self, path: str, impl: Implementation):
+    """Removes an implementation from the node
+
+    Args:
+      impl (supcon.intf.Implementation):
+    """
+    raise NotImplementedError()
+
+  @abc.abstractmethod
+  def call(self, node: str, path: str, intf: str, method: str, args: dict) -> defer.Deferred:
+    """Calls a method on the bus
+
+    Args:
+      node (str): a node on the bus
+      path (str): a path on the given node
+      intf (str): an interface at the given path
+      method (str): a method of the given interface
+      args (dict): a dict of method arguments
+
+    Returns:
+      defer.Deferred:
+    """
+    raise NotImplementedError()
+
+  @abc.abstractmethod
+  def on(self, node: str, path: str, intf: str, event: str, cb):
+    """Registers a callback for an event on the bus
+
+    Args:
+      node (str): a node on the bus
+      path (str): a path on the given node
+      intf (str): an interface at the given path
+      event (str): a method of the given interface
+      cb (callable): a callable that gets called with a dict of event arguments
+    """
+    raise NotImplementedError()
+
+  @abc.abstractmethod
+  def off(self, node: str, path: str, intf: str, event: str, cb):
+    """Unregisters a callback for an event on the bus
+
+    Args:
+      node (str): a node on the bus
+      path (str): a path on the given node
+      intf (str): an interface at the given path
+      event (str): a method of the given interface
+      cb (callable): a callable that gets called with a dict of event arguments
+    """
+    raise NotImplementedError()
diff --git a/supcon/keyed.py b/supcon/keyed.py
new file mode 100644 (file)
index 0000000..a30e9a4
--- /dev/null
@@ -0,0 +1,80 @@
+
+class KeyedMethod():
+
+  def __init__(self, key, fget):
+    self.__key = key
+    self.__fget = fget
+    self.__doc__ = fget.__doc__
+
+  @property
+  def key(self):
+    return self.__key
+
+  @property
+  def fget(self):
+    return self.__fget
+
+  def __get__(self, obj, objType=None):
+    if obj is None:
+      return self
+    if self.__fget is None:
+      raise AttributeError("unreadable attribute")
+    return lambda *args, **kwargs: self.__fget(obj, *args, **kwargs)
+
+def lKeyedMethods(aClass):
+  """
+  Returns a dict of all KeyedMethods of the given class indexed by attribute
+  name. The dict does not contain the KeyedMethods of any super class.
+  """
+  if aClass is object:
+    return {}
+
+  lAttrs = vars(aClass)
+  if not '_lKeyedMethods' in lAttrs:
+    methods = {}
+    for name, attr in lAttrs.items():
+      if isinstance(attr, KeyedMethod):
+        methods[name] = attr
+    aClass._lKeyedMethods = methods
+  return aClass._lKeyedMethods
+
+def mKeyedMethods(aClass):
+  """
+  Returns a dict of all KeyedMethods of the given class indexed by attribute
+  name. The dict contains the KeyedMethods of all super classes that are not
+  hidden by the method resolution order.
+  """
+  if not '_mKeyedMethods' in vars(aClass):
+    methods = {}
+    for sClass in reversed(aClass.mro()):
+      methods.update(lKeyedMethods(sClass))
+    aClass._mKeyedMethods = methods
+  return aClass._mKeyedMethods
+
+def iKeyedMethods(aClass):
+  """
+  Returns a dict of all KeyedMethods of the given class indexed by key. The dict
+  contains the KeyedMethods of all super classes that are not hidden by the
+  method resolution order.
+  """
+  if not '_iKeyedMethods' in vars(aClass):
+    methods = {}
+    for _name, attr in mKeyedMethods(aClass).items():
+      if attr.key in methods:
+        raise ValueError()
+      methods[attr.key] = attr
+    aClass._iKeyedMethods = methods
+  return aClass._iKeyedMethods
+
+def keyedMethod(key):
+  """
+  Can be used to decorate a method with a key
+  """
+  return lambda fget: KeyedMethod(key, fget)
+
+def callKeyedMethod(obj, key, *args, **kwargs):
+  """
+  Resolves a keyed method by the given key and and calls it with the given
+  arguments.
+  """
+  return iKeyedMethods(type(obj))[key].__get__(obj)(*args, **kwargs)
diff --git a/supcon/store.py b/supcon/store.py
new file mode 100644 (file)
index 0000000..d734dbd
--- /dev/null
@@ -0,0 +1,90 @@
+
+import msgpack
+
+import twisted.internet.defer as defer
+import twisted.internet.threads as threads
+
+class Store(object):
+
+  def load(self, key: str) -> defer.Deferred:
+    pass
+
+  def store(self, key: str, data: bytes) -> defer.Deferred:
+    pass
+
+  def delete(self, key: str) -> defer.Deferred:
+    pass
+
+def readFile(name: str) -> defer.Deferred:
+  print('readFile')
+  def inThread():
+    print('readFile > inThread')
+    with open(name, 'r+b') as fd:
+      return fd.read()
+
+  return threads.deferToThread(inThread)
+
+def writeFile(name: str, data: bytes) -> defer.Deferred:
+  print('writeFile')
+  def inThread():
+    print('writeFile > inThread')
+    with open(name, 'w+b') as fd:
+      return fd.write(data)
+
+  return threads.deferToThread(inThread)
+
+class FileStore(Store):
+
+  def __init__(self, name):
+    self.__name = name
+    self.__data = {}
+    self.__last = self.__readData()
+
+  @defer.inlineCallbacks
+  def __readData(self):
+    data = yield readFile(self.__name)
+    data = msgpack.unpackb(data, encoding='utf-8')
+    if isinstance(data, dict):
+      self.__data = data
+
+  @property
+  def name(self):
+    return self.__name
+
+  def __queue(self, job) -> defer.Deferred:
+    d = defer.Deferred()
+
+    def trampolineSucceed(result):
+      if isinstance(result, defer.Deferred):
+        result.addCallbacks(trampolineSucceed, trampolineFail)
+      else:
+        d.callback(result)
+
+    def trampolineFail(result):
+      if isinstance(result, defer.Deferred):
+        result.addCallbacks(trampolineSucceed, trampolineFail)
+      else:
+        d.errback(result)
+
+    self.__last.addBoth(lambda _: job())
+    self.__last.addCallbacks(trampolineSucceed, trampolineFail)
+
+    return d
+
+  def load(self, key: str) -> defer.Deferred:
+    def job():
+      return self.__data[key] if key in self.__data else None
+    return self.__queue(job)
+
+  def store(self, key: str, data) -> defer.Deferred:
+    def job():
+      self.__data[key] = data
+      return writeFile(self.__name, msgpack.packb(self.__data, use_bin_type=True))
+    return self.__queue(job)
+
+  def delete(self, key: str) -> defer.Deferred:
+    def job():
+      if key in self.__data:
+        del self.__data[key]
+        return writeFile(self.__name, msgpack.packb(self.__data, use_bin_type=True))
+    return self.__queue(job)
diff --git a/supcon/switch.py b/supcon/switch.py
new file mode 100644 (file)
index 0000000..6726e2b
--- /dev/null
@@ -0,0 +1,208 @@
+# -*- coding: utf-8 -*-
+
+import pigpio
+import supcon.util
+import supcon.intf
+
+""" the interface com.screwerk.Sensor """
+SensorIntf = supcon.intf.DInterface.load({
+  'name':
+  'com.screwerk.Sensor',
+  'events': [{
+    'name': 'changed',
+    'args': [
+      {
+        'name': 'value', 'description': 'The new sensor value'
+      }
+    ],
+    'description': 'Fires when the sensor value changes'
+  }],
+  'methods': [{
+    'name': 'value',
+    'outArgs': [
+      {
+        'name': 'value', 'description': 'The sensor value'
+      }
+    ],
+    'description': 'Returns the sensor value'
+  }]
+})
+
+""" the interface com.screwerk.Switch """
+SwitchIntf = supcon.intf.DInterface.load({
+  'name': 'com.screwerk.Switch',
+  'methods': [
+    {
+      'name': 'on', 'description': 'Toggles the switch on'
+    }, {
+      'name': 'off', 'description': 'Toggles the switch off'
+    }, {
+      'name': 'toggle', 'description': 'Toggles the switch'
+    }
+  ]
+})
+
+
+def returnTrue(*args): return True
+def returnNone(*args): return None
+def returnFirst(*args): return args[0]
+
+
+class SoftSensor(object):
+  def __init__(self, value=None, guard=None, effect=None, convert=None):
+
+    self.__guard = guard or returnTrue
+    self.__effect = effect or returnNone
+    self.__convert = convert or returnFirst
+
+    self.__value = self.__convert(value)
+
+    self.__sensor = supcon.intf.Implementation(SensorIntf)
+    self.__sensor.setCallCb('value', lambda: {'value': self.__value})
+
+  @property
+  def value(self):
+    return self.__value
+
+  @property
+  def sensor(self):
+    return self.__sensor
+
+  def update(self, value):
+    value = self.__convert(value)
+    if self.__value == value:
+      return False
+    if not self.__guard(value, self):
+      return False
+
+    self.__value = value
+    self.__effect(value, self)
+    self.__sensor.fire('changed', {'value': value})
+    return True
+
+
+class SoftSwitch(SoftSensor):
+  def __init__(self, value=False, guard=None, effect=None, convert=None):
+    boolConvert = (lambda value: bool(convert(value))) if convert else bool
+    SoftSensor.__init__(self, value, guard, effect, boolConvert)
+
+    update = lambda value: {} if self.update(value) else {}
+    self.__switch = supcon.intf.Implementation(SwitchIntf)
+    self.__switch.setCallCb('on', lambda: update(True))
+    self.__switch.setCallCb('off', lambda: update(False))
+    self.__switch.setCallCb('toggle', lambda: update(not self.value))
+
+  @property
+  def switch(self):
+    return self.__switch
+
+
+class PiGPIOSensor(object):
+  def __init__(self, reactor, gpio):
+    self.__reactor = reactor
+    self.__gpio = gpio
+
+    self.__pi = pigpio.pi()
+    self.__pi.set_mode(self.__gpio, pigpio.INPUT)
+    self.__pi.set_glitch_filter(self.__gpio, 50000)
+    self.__pi.set_pull_up_down(self.__gpio, pigpio.PUD_UP)
+    self.__pi.callback(self.__gpio, pigpio.EITHER_EDGE, self.__callback)
+
+    self.__value = bool(self.__pi.read(self.__gpio))
+
+    self.__sensor = supcon.intf.Implementation(SensorIntf)
+    self.__sensor.setCallCb('value', lambda: {'value': self.__value})
+
+  @property
+  def sensor(self):
+    return self.__sensor
+
+  def __callback(self, gpio, level, tick):
+    if level >= 2:
+      return
+
+    self.__reactor.callFromThread(self.__update, bool(level))
+
+  def __update(self, value):
+    if self.__value == bool(value):
+      return
+
+    self.__value = bool(value)
+    self.__sensor.fire('changed', {'value': self.__value})
+
+
+class PiGPIOSwitch(SoftSwitch):
+  def __init__(self, gpio, guard=None, effect=None, convert=None):
+    self.__gpio = gpio
+
+    self.__pi = pigpio.pi()
+    self.__pi.set_mode(self.__gpio, pigpio.OUTPUT)
+
+    value = self.__pi.read(self.__gpio)
+
+    def writeEffect(value, switch):
+      self.__pi.write(self.__gpio, int(value))
+      if callable(effect):
+        effect(value, switch)
+
+    super().__init__(value, guard, writeEffect, convert)
+
+
+class NodeSensor(supcon.util.EventEmitter):
+
+  def __init__(self, local: supcon.intf.Node, node: str, path: str):
+    supcon.util.EventEmitter.__init__(self)
+
+    self.__local = local
+    self.__node = node
+    self.__path = path
+
+    self.__value = None
+
+    self.__local.on(self.__local.name, '/', 'supcon.Local', 'intf', self.__onIntf)
+    self.__local.on(self.__local.name, '/', 'supcon.Local', 'intfLost', self.__onIntfLost)
+    self.__local.on(self.node, self.path, 'com.screwerk.Sensor', 'changed', self.__onChanged)
+
+    if self.__local.nodes().hasIntf(self.node, self.path, 'com.screwerk.com'):
+      self.__fetchValue()
+
+  def __del__(self):
+    self.__local.off(self.__local.name, '/', 'supcon.Local', 'intf', self.__onIntf)
+    self.__local.off(self.__local.name, '/', 'supcon.Local', 'intfLost', self.__onIntfLost)
+    self.__local.off(self.node, self.path, 'com.screwerk.Sensor', 'changed', self.__onChanged)
+
+  @property
+  def node(self):
+    return self.__node
+
+  @property
+  def path(self):
+    return self.__path
+
+  @property
+  def value(self):
+    return self.__value
+
+  def __fetchValue(self):
+    self.__local.call(self.node, self.path, 'com.screwerk.Sensor', 'value', {}).addCallbacks(
+      lambda args: self.__update(args['value']),
+      lambda reason: self.__update(None)
+    )
+
+  def __update(self, value):
+    if self.__value == value:
+      return
+
+    self.__value = value
+    self.emit('changed', self.__value)
+
+  def __onIntf(self, args, event):
+    if (args.node == self.node and args.path == self.path and args.intf.name == 'com.screwerk.Sensor'):
+      self.__fetchValue()
+
+  def __onIntfLost(self, args, event):
+    if (args.node == self.node and args.path == self.path and args.intf.name == 'com.screwerk.Sensor'):
+      self.__update(None)
+
+  def __onChanged(self, args, event):
+       self.__update(args['value'])
diff --git a/supcon/util.py b/supcon/util.py
new file mode 100644 (file)
index 0000000..379f450
--- /dev/null
@@ -0,0 +1,175 @@
+# -*- coding: utf-8 -*-
+
+import abc
+
+import asyncio
+import collections
+import collections.abc
+
+import twisted.internet.defer
+
+def schedule(obj):
+  if asyncio.iscoroutine(obj):
+    obj = twisted.internet.defer.ensureDeferred(obj)
+  return obj
+
+class Dumpable(abc.ABC):
+  """
+  The abstract base class `supcon.util.Dumpable`.
+
+  Implementations of this abstract base class can be converted to and from
+  'simple' datastructures containing only ints, floats, strings, lists and
+  dicts. These simple datastructures can be send and received by the supcon
+  bus. If you only ever use simple datastructures you can ignore this class.
+  """
+
+  @abc.abstractmethod
+  def dump(self):
+    """
+    Converts the `supcon.util.Dumpable` into a 'simple' datastructure.
+    """
+    pass
+
+  @abc.abstractclassmethod
+  def load(cls, data):
+    """
+    Converts the given 'simple' datastructure **data** into an instance of
+    **cls**, a subclass of `supcon.util.Dumpable`
+    """
+    pass
+
+
+class Named(abc.ABC):
+  """
+  The abstract base class `supcon.util.Named`.
+
+  Implementations of this abstract base class must have a property
+  `supcon.util.Named.name`, that can be used as a key in a dictionary.
+  """
+
+  @property
+  @abc.abstractmethod
+  def name(self) -> str:
+    """
+    The name of the instance. Is useable as a dictionary key.
+    """
+    pass
+
+
+class NamedList(collections.abc.Mapping, Dumpable):
+  """
+  A `supcon.util.NamedList` is an ordered, readonly dictionary of
+  `supcon.util.Named` and `supcon.util.Dumpable` elements of value type
+  `supcon.util.NamedList.vtype`.
+
+  The class `supcon.util.NamedList` itself can not be instantiated. It must be
+  subclassed and the class property `supcon.util.NamedList.vtype` set. The class
+  property `supcon.util.NamedList.vtype` denotes the type of the elements that
+  the list can contain. The type `supcon.util.NamedList.vtype` must be a
+  subclass of `supcon.util.Named` and of `supcon.util.Dumpable`. Elements in the
+  `supcon.util.NamedList.vtype` can be accessed by the values of their
+  `supcon.util.Named.name` property.
+  """
+
+  vtype = None
+  """
+  Must be assigned in a subclass of `supcon.util.NamedList` to a subclass
+  of `supcon.util.Named` and `supcon.util.Dumpable`
+  """
+
+  def __init__(self, values=None):
+    """
+    Initializes the `supcon.util.NamedList` with the given list of **values**.
+
+    An element of **values** must be of type `supcon.util.NamedList.vtype` or a
+    'simple' datastructure that can be converted to an instance of
+    `supcon.util.NamedList.vtype` by `supcon.util.NamedList.vtype`.load().
+    """
+    if values is None:
+      values = []
+    if not issubclass(self.vtype, Named):
+      raise ValueError('the value type must be a subclass of Named')
+    if not issubclass(self.vtype, Dumpable):
+      raise ValueError('the value type must be a subclass of Dumpable')
+
+    self.__values = collections.OrderedDict()
+
+    for value in values:
+      if not isinstance(value, self.vtype):
+        value = self.vtype.load(value)
+      if value.name in self.__values:
+        raise ValueError('value.name must be unique in the given list of values')
+      self.__values[value.name] = value
+
+  def __getitem__(self, key):
+    return self.__values[key]
+
+  def __iter__(self):
+    return iter(self.__values)
+
+  def __len__(self):
+    return len(self.__values)
+
+  def __repr__(self):
+    return "{}.{}({})".format(
+      self.__module__, self.__class__.__name__,
+      ', '.join([repr(v) for k, v in self.items()])
+    )
+
+  def dump(self):
+    """
+    Converts the `supcon.util.NamedList` into a list of 'simple' datastructures.
+    """
+    return [value.dump() for value in self.values()]
+
+  @classmethod
+  def load(cls, data):
+    """
+    Converts the given list of 'simple' datastructures **data** into an instance
+    of **cls**, a subclass of `supcon.util.NamedList`.
+    """
+    return cls(data)
+
+  @classmethod
+  def to(cls, value):
+    """
+    If the the **value** is an instance of **cls**, a subclass of
+    `supcon.util.NamedList`, the value is returned. If value is not an instance
+    of **cls** the method tries to convert the **value** into an instance of
+    **cls**.
+    """
+    return value if isinstance(value, cls) else cls.load(value)
+
+
+class EventEmitter(object):
+
+  def __init__(self):
+    self.__callbacks = {}
+
+  def on(self, event, callback):
+    """
+    Registers the given callback for the given event
+    """
+    if type not in self.__callbacks:
+      self.__callbacks[event] = {}
+    self.__callbacks[event][id(callback)] = callback
+    return lambda: self.off(event, callback)
+
+  def off(self, event, callback):
+    """
+    Unregisters the given callback for the given event
+    """
+    if event not in self.__callbacks:
+      return
+    if id(callback) not in self.__callbacks[event]:
+      return
+    del self.__callbacks[event][id(callback)]
+
+  def emit(self, event, *args):
+    """
+    Calls all callbacks for the given event with the given arguments
+    """
+    if event not in self.__callbacks:
+      return
+    for callback in self.__callbacks[event].values():
+      schedule(callback(*args))