#!/usr/bin/env bash # shebang for syntax detection, not a command # do *not* set executable! declare -Ag _modules_ shopt -s expand_aliases alias _args_='(( $# ))' alias _to_args_='set --' module.already_loaded () { declare -Ag _modules_ [[ -v _modules_[${BASH_SOURCE[1]}] ]] } _blank_ () { [[ -z ${1:-} ]] } _defined_ () { [[ -v $1 ]] } _eq_ () { [[ $1 == "${2:-}" ]] } _functions_ () { env -i bash </dev/null compgen -A function;: END } _in_ () { [[ $IFS$1$IFS == *"$IFS$2$IFS"* ]] } _pop_ () { local -n ref1=$1 local ref2=${2:-} _present_ $ref2 && printf -v $ref2 %s "${ref1[-1]}" unset -v $1[-1] } _present_ () { [[ -n ${1:-} ]] } _push_ () { local -n ref=$1 ref+=( "$2" ) } _parent_=${BASH_SOURCE[1]:-} [[ ${1:-} != module ]] && return set -- ${*:2} _numargs_+=( $# ) { ! _args_ && _present_ ${_file_:-} && _eq_ $_parent_ $_file_ ;} && return { ! _args_ && _present_ $_parent_ && ! _eq_ ${_parent_##*/} module ;} && { _in_ "${_ancestors_[*]:-}" $_parent_ && return _push_ _ancestors_ $_parent_ } ! _args_ && _to_args_ $_parent_ for _file_; do _module_=${_file_%%=*} _file_=${_file_#*=} _defined_ _modules_[$_file_] && continue _eq_ $_module_ $_file_ && { _module_=${_module_##*/} _module_=${_module_%.*} } _prefixes_+=( $_module_ ) _push_ _aliases_ "$(alias)" unalias -a _functions_=$(_functions_ $_file_) for _function_ in $_functions_; do printf -v _prefix_ %s. ${_prefixes_[*]} alias $_function_=$_prefix_$_function_ done _push_ _files_ $_file_ _push_ _funcs_ "$_functions_" set -- source $_file_ unset -v _prefixes_[-1] _pop_ _files_ _file_ _pop_ _funcs_ _functions_ _modules_[$_file_]='' for _function_ in $_functions_; do unalias $_function_ done eval "${_aliases_[-1]}" _pop_ _aliases_ done ! (( ${#_files_[*]} )) && { unalias _args_ unalias _to_args_ unset -f _blank_ unset -f _defined_ unset -f _eq_ unset -f _in_ unset -f _pop_ unset -f _present_ unset -f _push_ unset -v _file_ unset -v _funcs_ unset -v _function_ unset -v _functions_ unset -v _module_ unset -v _name_ unset -v _parent_ unset -v _prefix_ unset -v _prefixes_ } { ! (( _numargs_[-1] )) && [[ -n ${BASH_SOURCE[1]} && ${BASH_SOURCE[1]##*/} != module ]] ;} && unset -v _ancestors_[-1] unset -v _numargs_[-1]