#autoload

#
#
#
#
#
#
#
#
#
#
#
#

local sep tag style keys pats key num tmp

if [[ "$1" = -s ]]; then
  sep="$2"
  shift 2
elif [[ "$1" = -s* ]]; then
  sep="${1[3,-1]}"
  shift
else
  sep=:
fi

tag="$1"
style="$2"
shift 2

keys=( ${(s/-/)style} )
pats=( "${(@)keys/*/*}" )

while [[ "$1" = *=* ]]; do
  tmp="${1%%\=*}"
  key="${tmp%:*}"
  if [[ $1 = *:* ]]; then
    num=${tmp##*:}
  else
    num=1
  fi
  pats[$keys[(in:num:)$key]]="${1#*\=}"
  shift
done

key="${1%:*}"
if [[ $1 = *:* ]]; then
  num=${1##*:}
else
  num=1
fi
shift

if zstyle -a ":completion:${curcontext}:$tag" "$style" tmp; then
  eval "tmp=( \"\${(@M)tmp:#\${(j($sep))~pats}}\" )"
  if (( keys[(in:num:)$key] != 1 )); then
    eval "tmp=( \${tmp#\${(j(${sep}))~\${(@)\${(@)keys[2,(rn:num:)\$key]}/*/*}}${~sep}} )"
  fi
  tmp=( ${tmp%%${~sep}*} )

  compadd "$@" -a tmp || { (( $+functions[_$key] )) && "_$key" "$@" }
else
  (( $+functions[_$key] )) && "_$key" "$@"
fi
