function bos-namespaces/store-for-into() {
local name="bos_namespaces__${2//[^[:word:]/__}__${1//[^[:word:]]/__}"
local -n result="$2"
declare -gA "$name"
result="$name"
}
function bos-namespaces/start() {
local namespace="$1";shift
local ns_store; bos-namespaces/store-for-into saved_funcs "$namespace" ns_store
local -n saved_funcs="$ns_store"
local _ funcname
while read -r _ _ funcname; do
saved_funcs+=( ["$funcname"]="$(declare -pf "$funcname")" )
done < <( declare -pF )
return 0
}
function bos-namespaces/list-new-funcs-into() {
local namespace="$1";shift
local -n result="$1"
local ns_store; bos-namespaces/store-for-into saved_funcs "$namespace" ns_store
local -n saved_funcs="$ns_store"
local _ funcname new_function
while read -r _ _ funcname; do
new_function="$(declare -pf "$funcname")"
if [[ "$new_function" != "${saved_funcs["$funcname"]}" ]]; then
result+=( "${funcname}" )
fi
done < <( declare -pF )
return 0
}
function bos-namespaces/qualify-funcs() {
local namespace="$1";shift
local ns_store; bos-namespaces/store-for-into saved_funcs "$namespace" ns_store
local -n saved_funcs="$ns_store"
local _ funcname new_function
for funcname in "$@"; do
new_function="$(declare -pf "$funcname")"
eval "${namespace}/${new_function}"
if [[ -n "${saved_funcs["$funcname"]}" ]]; then
eval "${saved_funcs["$funcname"]}"
else
unset -f "$funcname"
fi
done
return 0
}