 
   @type t :: String.t | Version.Schema.t
   @type requirement :: String.t | Version.Requirement.t
+  @type matchable :: { major :: String.t | non_neg_integer,
+                       minor :: non_neg_integer | nil,
+                       patch :: non_neg_integer | nil,
+                       pre   :: [String.t] }
 
   import Kernel, except: [match?: 2]
 

  """
  @spec parse(String.t) :: { :ok, Schema.t } | :error
  def parse(string) when is_binary(string) do
    try do
      matchable = Version.Parser.parse_version(string)
      { :ok, from_matchable(matchable).source(string).build(get_build(string)) }
     catch
      :throw, _ -> :error
    end
  end


    @spec parse_requirement(String.t) :: Version.Requirement.t
    def parse_requirement(source) do
      lexed = lexer(source, [])
      to_matchspec(lexed)
    end

    defp nillify(""), do: nil
