OPTS=()
OPTS_N=0
while true; do
	case "$1" in
	-|--)	shift; break ;;
	-*) OPTS[$OPTS_N]="$1"
	OPT="${1#-}"
	OPT="${OPT#-}"
	OPT="${OPT//-/_}"
	case "$OPT" in
	*=*)
		VAL=${OPT#*=}
		OPT=${OPT%%=*}
		eval $OPT=\$VAL
		;;
	[a-zA-Z]*)
		eval $OPT=1
		;;
	*)
		eval opt_$OPT=1
		;;

# TODO list-valued options like in a2b?
	esac
	shift
	OPTS_N=$[$OPTS_N + 1]
	;;
	*) break ;;
	esac
done


## usage from bash, e.g.:
# . opts
# for O in "${OPTS[@]}"; do
# 	case "$O" in
# 	-h|--help)  echo_help ;;
#	*)  . die unknown option; exit 1 ;;
# 	esac
# done
#
# or:
# 
# if [ -n "$help" ]; then echo_help; fi
# if [ "$age" -ge 21 ]; then run_naughty_version; fi

## if you use opts within a function, do it like this:
# local OPTS 
# local OPTS_N
# . opts
