#!/usr/bin/env bash

start_step()
{
  steps_started+=( "$1" )
}

step()
{
  local name="$1"
  shift

  if variable_is_empty name
  then fail "step_start [name] #missing name"
  fi

  start_step "$name"

  if command_exists before_step
  then before_step "$name" "$@"
  fi

  "$name" "$@"

  if command_exists after_step
  then after_step "$name" "$@"
  fi
}

steps()
{
  for step in $@
  do
    step "${step}"
  done
}

retreat()
{
  local step

  if array_is_empty steps_started
  then
    steps_started=( "$@" )
  fi

  while array_is_nonempty steps_started
  do
    array_pop steps_started step

    if command_exists "fail_${step}"
    then "fail_${step}"
    fi

    if command_exists after_step
    then after_step "fail_${step}"
    fi
  done
}
