Refactor `passage_span_context` module
diff --git a/src/passage_span.erl b/src/passage_span.erl
index e97ceff..3d08bb5 100644
--- a/src/passage_span.erl
+++ b/src/passage_span.erl
@@ -13,7 +13,7 @@
 -export([get_tags/1]).
 -export([get_refs/1]).
 -export([get_logs/1]).
--export([get_baggage_items/1]).
+-export([get_context/1]).
 
 -export_type([span/0]).
 -export_type([normalized_refs/0, normalized_ref/0]).
@@ -29,8 +29,8 @@
 -export([set_tags/2]).
 -export([log/3]).
 -export([set_baggage_items/2]).
+-export([get_baggage_items/1]).
 -export([get_tracer/1]).
--export([get_context/1]).
 
 %%------------------------------------------------------------------------------
 %% Macros & Records
@@ -79,9 +79,9 @@
 get_logs(Span) ->
     Span#?SPAN.logs.
 
--spec get_baggage_items(span()) -> passage:baggage_items().
-get_baggage_items(Span) ->
-    passage_span_context:get_baggage_items(Span#?SPAN.context).
+-spec get_context(span()) -> passage_span_context:context().
+get_context(Span) ->
+    Span#?SPAN.context.
 
 %%------------------------------------------------------------------------------
 %% Application Internal Functions
@@ -171,9 +171,9 @@
     Span#?SPAN{context = passage_span_context:set_baggage_items(Context, Items)}.
 
 %% @private
--spec get_context(span()) -> passage_span_context:context().
-get_context(Span) ->
-    Span#?SPAN.context.
+-spec get_baggage_items(span()) -> passage:baggage_items().
+get_baggage_items(Span) ->
+    passage_span_context:get_baggage_items(Span#?SPAN.context).
 
 %% @private
 -spec get_tracer(span()) -> passage:tracer_id().
diff --git a/src/passage_span_context.erl b/src/passage_span_context.erl
index 36c206c..bebda81 100644
--- a/src/passage_span_context.erl
+++ b/src/passage_span_context.erl
@@ -1,53 +1,87 @@
+%% @copyright 2017 Takeru Ohta <phjgt308@gmail.com>
+%%
+%% @doc TODO
+%%
 -module(passage_span_context).
 
--export([make/2]).
+%%------------------------------------------------------------------------------
+%% Exported API
+%%------------------------------------------------------------------------------
 -export([get_baggage_items/1]).
+-export([get_state/1]).
+
+-export_type([context/0]).
+-export_type([state/0]).
+-export_type([format/0]).
+-export_type([carrier/0]).
+-export_type([inject_fun/0]).
+
+%%------------------------------------------------------------------------------
+%% Application Internal API
+%%------------------------------------------------------------------------------
+-export([make/2]).
 -export([set_baggage_items/2]).
 
--export_type([context/0, maybe_context/0]).
+%%------------------------------------------------------------------------------
+%% Callback API
+%%------------------------------------------------------------------------------
+-callback make_span_context(passage_span:normalized_refs()) -> context().
 
+-callback inject_span_context(context(), format(), carrier(), inject_fun()) -> carrier().
+
+-callback extract_span_context(format(), carrier(), iterate_fun()) -> {ok, context()} | error.
+
+%%------------------------------------------------------------------------------
+%% Macros & Records
+%%------------------------------------------------------------------------------
 -define(CONTEXT, ?MODULE).
 
 -record(?CONTEXT,
         {
-          state :: term(),
+          state               :: state(),
           baggage_items = #{} :: passage:baggage_items()
         }).
 
+%%------------------------------------------------------------------------------
+%% Exported Types
+%%------------------------------------------------------------------------------
 -opaque context() :: #?CONTEXT{}.
 
--type maybe_context() :: context() | undefined.
+-type state() :: term().
 
 -type format() :: text_map | http_header | binary.
 
 -type carrier() :: term().
 
--type key() :: binary().
--type value() :: binary().
--type inject_fun() :: fun ((key(), value(), carrier()) -> carrier()).
--type extract_fun() :: fun ((carrier()) -> {ok, key(), value(), carrier()} | error).
+-type inject_fun() :: fun ((Key :: binary(), Value :: binary(), carrier()) -> carrier()).
 
--callback make_span_context(passage_span:span(), passage:baggage_items()) ->
-    passage_span_context:context().
+-type iterate_fun() ::
+        fun ((carrier()) -> {ok, Key :: binary(), Value :: binary(), carrier()} | error).
 
--callback inject_span_context(passage_span_context:context(), format(),
-                              carrier(), inject_fun()) -> carrier().
+%%------------------------------------------------------------------------------
+%% Exported Functions
+%%------------------------------------------------------------------------------
+-spec get_baggage_items(context()) -> passage:baggage_items().
+get_baggage_items(Context) ->
+    Context#?CONTEXT.baggage_items.
 
--callback extract_span_context(format(), carrier(), extract_fun()) ->
-    {ok, passage_span_context:context()} | error.
+-spec get_state(context()) -> state().
+get_state(Context) ->
+    Context#?CONTEXT.state.
 
+%%------------------------------------------------------------------------------
+%% Application Internal Functions
+%%------------------------------------------------------------------------------
+%% @private
 -spec make(passage:tracer_id(), passage_span:normalized_refs()) -> context().
 make(Tracer, Refs) ->
-    State = passage_tracer:make_span_context_state(Tracer, Refs),
+    Module = passage_registry:get_tracer_module(Tracer),
+    State = Module:make_span_context_state(Refs),
     BaggageItems = lists:foldr(fun maps:merge/2, #{}, Refs),
-    #?CONTEXT{ state = State, baggage_items = BaggageItems }.
+    #?CONTEXT{state = State, baggage_items = BaggageItems}.
 
--spec get_baggage_items(maybe_context()) -> passage:baggage_items().
-get_baggage_items(undefined) -> #{};
-get_baggage_items(Context)   -> Context#?CONTEXT.baggage_items.
-
--spec set_baggage_items(maybe_context(), passage:baggage_items()) -> maybe_context().
-set_baggage_items(undefined, _BaggageItems) -> undefined;
-set_baggage_items(Context,    BaggageItems) ->
+%% @private
+-spec set_baggage_items(context(), passage:baggage_items()) -> context().
+set_baggage_items(Context, BaggageItems) ->
     Merged = maps:merge(Context#?CONTEXT.baggage_items, BaggageItems),
     Context#?CONTEXT{baggage_items = Merged}.
diff --git a/src/passage_tracer.erl b/src/passage_tracer.erl
index fde179e..8cd6771 100644
--- a/src/passage_tracer.erl
+++ b/src/passage_tracer.erl
@@ -2,19 +2,12 @@
 
 -export([start/2, start/3]).
 -export([get_sampler/1]).
--export([make_span_context_state/2]).
 
 -export_type([start_option/0]).
 
 -type start_option() :: {sampler, passage_sampler:sampler()}
                       | {reporters, [passage_reporter:reporter()]}.
 
--spec make_span_context_state(passage:tracer_id(), passage_span:normalized_refs()) ->
-                                     passage_span_context:state().
-make_span_context_state(Tracer, Refs) ->
-    Module = passage_registry:get_tracer_module(Tracer),
-    Module:make_span_context_state(Refs).
-
 -spec get_sampler(passage:tracer_id()) -> passage_sampler:sampler().
 get_sampler(Tracer) ->
     passage_registry:get_sampler(Tracer).