README.md

# TwoFaced

  Two-phase child process initialization for OTP-compliant processes.

  This module provides functionality to start child processes that require
  two-phase initialization. It is particularly useful when using dynamic
  supervisors where the child process needs to perform lengthy initialization
  without blocking the supervisor.

  Applications that wish to utilize this functionality should:

  1. Define their child processes to support a two-phase initialization pattern.
  2. Parent their child processes under a DynamicSupervisor.
  3. Use `TwoFaced.start_child/2,3` to start and initialize the child processes.

  Handling two-phase initialization means deferring long-running setup tasks via
  handle_continue/2 callbacks in GenServer or similar OTP behaviours, and handling
  an acknowledgment message (of type `ack_request()`) to signal completion.

## Usage

  ```elixir
  defmodule MyServer do
    use GenServer

    @impl GenServer
    def init(args) do
      {:ok, %{}, {:continue, {:init, args}}}
    end

    @impl GenServer
    def handle_continue({:init, args}, state) do
      # Perform lengthy initialization here
      :timer.sleep(2000)
      {:noreply, state}
    end

    @impl GenServer
    # Acknowledge initialization completion
    def handle_info({TwoFaced, :ack, ref}, state) do
      TwoFaced.acknowledge(ref)
      {:noreply, state}
    end
  end

  {:ok, sup} = DynamicSupervisor.start_link(strategy: :one_for_one)
  child_spec = {MyServer, some_arg: :value}
  {:ok, pid} = TwoFaced.start_child(sup, child_spec)
  true = Process.alive?(pid)
  ```

## Installation

If [available in Hex](https://hex.pm/docs/publish), the package can be installed
by adding `two_faced` to your list of dependencies in `mix.exs`:

```elixir
def deps do
  [
    {:two_faced, "~> 0.2.2"}
  ]
end
```

Documentation can be generated with [ExDoc](https://github.com/elixir-lang/ex_doc)
and published on [HexDocs](https://hexdocs.pm). Once published, the docs can
be found at <https://hexdocs.pm/two_faced>.