   Start a new `cell` child process in the supervisor, passing `position` as its initial state.
   Will call `start_link` above.
   """
+  @spec create({int, int}) :: on_start_child
   def create(position) do
     Supervisor.start_child(Cell.Supervisor, [position])
   end

  @doc """
  Start a cell and register it in the Registry, using the `position` as its name.
  """
  def start_link(position) do
    via_tuple = {:via, Registry, {Cell.Registry, position}}
    GenServer.start_link(__MODULE__, position, name: via_tuple)

  # Get the neighboring positions of `position`, filter out the dead neighbors,
  # then get the cell positions which should be created and return them.
  defp to_create(position) do
    position
    |> get_neighboring_positions
    |> get_dead_neighbors
    |> get_positions_to_create
  end
