 
   defp remote_type({remote, line, name, arguments}, vars, caller) do
     arguments = lc arg inlist arguments, do: typespec(arg, vars, caller)
-    quote do: {:remote_type, unquote(line), [unquote(remote), unquote(name), unquote(arguments)]}
+    {:remote_type, line, [remote, name, arguments]}
   end
 
-  defp collect_union({:"|", _, [a, b]}), do: [b|collect_union(a)]
+  defp collect_union({:|, _, [a, b]}), do: [b|collect_union(a)]
   defp collect_union(v), do: [v]
 
-  defp typespec({:"|", line, [_,_]} = orexpr, vars, caller) do
-    union = lc e inlist :lists.reverse(collect_union(orexpr)), do: typespec(e, vars, caller)
-    quote do: {:type, unquote(line), :union, lc e inlist unquote(union), do: e}
+  defp typespec({:|, line, [_,_]} = orexpr, vars, caller) do
+    union = lc e inlist List.reverse(collect_union(orexpr)), do: typespec(e, vars, caller)
+     { :type, line, :union, lc(e inlist union, do: e) }
   end
 
   defp typespec({:"<<>>", line, []}, _,_) do
-    quote do: {:type, unquote(line), :binary, [{:integer, unquote(line), 0}, {:integer, unquote(line), 0}]}
+     {:type, line, :binary, [{:integer, line, 0}, {:integer, line, 0}]}
   end
 
   defp typespec({:"<<>>", line, [{:"|", _, [{:_, line1, atom}, {:"*", _, [{:_, line2, atom}, unit]}]}]}, _, _) when atom in [:quoted, nil] do
-    quote do: {:type, unquote(line), :binary, [{:integer, unquote(line1), 0}, {:integer, unquote(line2), unquote(unit)}]}
+     {:type, line, :binary, [{:integer, line1, 0}, {:integer, line2, unit}]}
   end
 
   defp typespec({:"<<>>", line, [{:"|", line1, [{:_, line2, atom}, base]}]}, _, _) when atom in [:quoted, nil] do
-    quote do: {:type, unquote(line), :binary, [{:integer, unquote(line1), unquote(base)}, {:integer, unquote(line2), 0}]}
+     {:type, line, :binary, [{:integer, line1, base}, {:integer, line2, 0}]}
   end
   
   defp typespec({:"..", line, args}, vars, caller) do

  end

  defp typespec(t, vars, caller) when is_tuple(t) do
    quote do: {:type, 0, :tuple, unquote((lc e inlist tuple_to_list(t), do: typespec(e, vars, caller)))}
  end

  defp variable({name, line, _}) do


  defmacro __aggregate_specs__(module) do
    options = Module.read_attribute(module, :__typespec_options__)
    specs = List.reverse(Module.read_attribute(module, :__specs__))
    specs = :lists.ukeysort(1, lc {k, _} inlist specs, do: {k, :proplists.append_values(k, specs)})
    lc attr inlist specs, do: Module.add_attribute module, :spec, attr
    case options[:keep_data] do
