+### Hooks.
+
+__mdw_addhook () {
+ local hk=$1 fn=$2 t
+
+ eval t=\${$hk+t}
+ case $t in t) ;; *) echo >&2 "unknown hook \`$hk'"; return 2; esac
+
+ eval t=\$$hk
+ case " $t " in
+ *" $fn "*) ;;
+ *) eval "$hk=\${$hk:+\$$hk }\$fn" ;;
+ esac
+}
+
+__mdw_delhook () {
+ local hk=$1 fn=$2 t l r
+
+ eval t=\${$hk+t}
+ case $t in t) ;; *) echo >&2 "unknown hook \`$hk'"; return 2; esac
+
+ eval t=\" \$$hk \"
+ case $t in
+ *" $fn "*)
+ l=${t%% $fn*} r=${t##*$fn }
+ l=${l# } r=${r% }
+ eval "$hk=\$l\${l:+ }\$r"
+ ;;
+ esac
+}
+
+__mdw_setrc () { return $1; }
+
+__mdw_runhook () {
+ local hk=$1 saverc=$? t i; shift
+
+ eval t=\${$hk+t}
+ case $t in t) ;; *) echo >&2 "unknown hook \`$hk'"; return 2; esac
+
+ eval t=\$$hk
+ for i in $t; do __mdw_setrc $saverc; "$i" "$@"; done
+}
+
+###--------------------------------------------------------------------------