lib/supervisor.ex

defmodule ExCheckout.Checkout.Supervisor do
  use DynamicSupervisor

  @name __MODULE__

  def child_spec([args]) do
    %{
      id: __MODULE__,
      start: {__MODULE__, :start_link, args},
      type: :supervisor
    }
  end

  def start_child(args \\ []) do
    child_spec = %{
      id: ExCheckout.Server,
      start: {ExCheckout.Server, :start_link, args},
      restart: :transient
    }

    DynamicSupervisor.start_child(__MODULE__, child_spec)
  end

  def start_link(args \\ []) do
    DynamicSupervisor.start_link(__MODULE__, args, name: @name)
  end

  def stop_checkout(pid) do
    DynamicSupervisor.terminate_child(__MODULE__, pid)
  end

  def init(args) do
    DynamicSupervisor.init(
      strategy: :one_for_one,
      extra_arguments: args
    )
  end
end