# usage: call [] [-- ] # where: # is a dependency name as defined by dofile `default..do` # are named arguments to pass to dependency in following forms: # foo=bar -- sets argument foo to value "bar" # foo: -- unifies argument foo with variable foo in the caller # foo:bar -- unifies argument foo with variable bar in the caller # are arbitrary positional arguments local name local -A prev_vars prev_vars=( "${(kv)vars[@]}" ) vars=( ) name=$1 shift # parse variable assignments while (( $# )); do case $1 in (*=*) fresh ${1%%=*} setvar ${1%%=*} ${1#*=} ;; (*:) if (($+prev_vars[${1%:}])); then vars[${1%:}]=$prev_vars[${1%:}] else fresh ${1%:} prev_vars[${1%:}]=$vars[${1%:}] fi ;; (*:*) if (($+prev_vars[${1#*:}])); then vars[${1%:}]=$prev_vars[${1#*:}] else fresh ${1%:} prev_vars[${1%:}]=$vars[${1#*:}] fi ;; (--) shift; break;; (*) die "$name: unrecognised argument: ${(qqq)1}";; esac shift done call.$name "$@" || die "$0: ${(qqq)name} returned error" vars=( "${(kv)prev_vars[@]}" ) # vim: fileencoding=utf8 ft=zsh noet sw=4 ts=4 sts=4