 
   def add_protocol(name, functions) do
     Agent.update(__MODULE__, fn state ->
-      proto = do_get_module(state, name)
+      proto = Map.get(state.modules, do_get_module_name(name, state))
 
       if proto == nil do
         proto = %ElixirScript.Module{ name: name, functions: functions, impls: HashDict.new, type: :protocol }

  end

  def get_module(module) when is_atom(module) do
    state = Agent.get(__MODULE__, &(&1))
    do_get_module(state, module)
  end

  def get_module({:__aliases__, _, _} = name) do
    state = Agent.get(__MODULE__, &(&1))
    do_get_module(state, Utils.quoted_to_name(name))
  end

  def get_module(module_name_list) when is_list(module_name_list) do
    state = Agent.get(__MODULE__, &(&1))
    do_get_module(state, Utils.quoted_to_name({:__aliases__, [], module_name_list}))
  end

  defp do_get_module(state, name) do
    Map.get(state.modules, get_module_name(name, state))
  end

  def add_module_reference(module_name, module_ref) do
    module = get_module(module_name)

    if module do
      module = %{ module | module_refs: Enum.uniq(module.module_refs ++ [module_ref]) }
      add_module(module)
    end
  end

  def get_module_references(module_name) do

  end

  def get_module_name(module_name) do
    Agent.get(__MODULE__, fn(state) ->
      do_get_module_name(module_name, state)
    end)
  end

  defp do_get_module_name(module_name, state) do
    std_lib_map = state.std_lib_map
    case Map.get(std_lib_map, module_name) do
      nil ->
