     end
   end
 
+  @doc """
+  Converts a NaiveDateTime from one calendar to another.
+
+  If it is not possible to convert unambiguously between the calendars
+  (see `Calendar.compatible_calendars?/2`), an `{:error, :incompatible_calendars}` tuple
+  is returned.
+  """
+  @spec convert(NaiveDateTime.t, Calendar.calendar) :: {:ok, NaiveDateTime.t} | {:error, :incompatible_calendars}
   def convert(%{calendar: calendar} = naive_datetime, calendar) do
     {:ok, naive_datetime}
   end

  @callback time_from_day_fraction(day_fraction) :: {hour, minute, second, microsecond}

  @doc """
  Define the roll over period for the given calendar.

  The result of this function is used to check if two calendars roll over at
  the same time of day. If they do not, we can only convert datetimes and times
  between them. If they do, this means that we can also convert dates as well
  as naive datetimes.

  This day fraction should be in its most simplified form possible, to make comparisons fast.


    {:ok, result_time}
  end

  @doc """
  Similar to `Time.convert/2`, but raises an `ArgumentError`
  if the conversion between the two calendars is not possible.
  """
  @spec convert!(Calendar.time, Calendar.calendar) :: Calendar.time
  def convert!(time, calendar) do
    case convert(time, calendar) do
      {:ok, value} ->
