#!/usr/bin/env bash declare -A _LOADED_COMMANDS=() # Unused for now readonly _COMMAND_NAMESPACE="cmd" readonly _COMMAND_AUTO_LOAD_HOOK="on_load" function command::namespace { echo "${_COMMAND_NAMESPACE}"; } function command::fn { echo "$(command::namespace)::$(command::to_namespace "$1")::${2}"; } function command::loaded() { [[ -n "${_LOADED_COMMANDS["$1"]:-}" ]]; } function command::has_function() { declare -F "$(command::fn "$1" "$2")" >/dev/null 2>&1; } function command::is_auto_load() { declare -F "$(command::fn "$1" on_load)" >/dev/null 2>&1; } function command::to_namespace() { echo "${1//\//::}"; } function command::exists() { command::has_function "$1" run; } function command::run() { local cmd="$1" shift hook::run "$cmd" pre core::call_function "$(command::fn "$cmd" run)" "$@" local exit_code=$? if [[ $exit_code -eq 0 ]]; then hook::run "$cmd" post fi return $exit_code }