defmodule Pdf.ObjectCollection do @moduledoc false alias Pdf.Object defstruct size: 0, objects: %{} def new, do: %__MODULE__{} def create_object(%__MODULE__{size: size, objects: objects} = collection, object) do new_size = size + 1 key = {:object, new_size, 0} {key, %{collection | size: new_size, objects: Map.put(objects, key, object)}} end def get_object(%__MODULE__{objects: objects}, key) do Map.get(objects, key) end def update_object(%__MODULE__{objects: objects} = collection, key, value) do %{collection | objects: Map.put(objects, key, value)} end def call(%__MODULE__{objects: objects} = collection, object_key, method, args) do object = Map.get(objects, object_key) result = Kernel.apply(object.__struct__, method, [object | args]) {object_key, %{collection | objects: Map.put(objects, object_key, result)}} end def all(%__MODULE__{objects: objects}) do objects |> Enum.map(fn {{:object, number, _generation}, object} -> Object.new(number, object) end) end end