Refactor `passage_reporter` module
diff --git a/src/passage_reporter.erl b/src/passage_reporter.erl
index 6d47281..ed0f635 100644
--- a/src/passage_reporter.erl
+++ b/src/passage_reporter.erl
@@ -1,19 +1,72 @@
+%% @copyright 2017 Takeru Ohta <phjgt308@gmail.com>
+%%
+%% @doc TODO
+%%
 -module(passage_reporter).
 
+%%------------------------------------------------------------------------------
+%% Exported API
+%%------------------------------------------------------------------------------
 -export([new/2]).
--export([report/2]).
+-export([is_reporter/1]).
+-export([get_module/1]).
+-export([get_state/1]).
 
 -export_type([reporter/0]).
+-export_type([state/0]).
 
--callback report(passage_span:span(), term()) -> term().
+%%------------------------------------------------------------------------------
+%% Application Internal API
+%%------------------------------------------------------------------------------
+-export([report/2]).
 
--opaque reporter() :: {?MODULE, module(), term()}.
+%%------------------------------------------------------------------------------
+%% Callback API
+%%------------------------------------------------------------------------------
+-callback report(state(), passage_span:span()) -> Ignored :: term().
 
--spec new(module(), term()) -> passage_reporter:reporter().
+%%------------------------------------------------------------------------------
+%% Macros & Records
+%%------------------------------------------------------------------------------
+-define(REPORTER, ?MODULE).
+
+-record(?REPORTER,
+        {
+          module :: module(),
+          state  :: state()
+        }).
+
+%%------------------------------------------------------------------------------
+%% Exported Types
+%%------------------------------------------------------------------------------
+-opaque reporter() :: #?REPORTER{}.
+
+-type state() :: term().
+
+%%------------------------------------------------------------------------------
+%% Exported Functions
+%%------------------------------------------------------------------------------
+-spec new(module(), state()) -> passage_reporter:reporter().
 new(Module, State) ->
-    {?MODULE, Module, State}.
+    #?REPORTER{module = Module, state = State}.
 
+-spec is_reporter(reporter() | term()) -> boolean().
+is_reporter(X) ->
+    is_record(X, ?REPORTER).
+
+-spec get_module(reporter()) -> module().
+get_module(Reporter) ->
+    Reporter#?REPORTER.module.
+
+-spec get_state(reporter()) -> state().
+get_state(Reporter) ->
+    Reporter#?REPORTER.state.
+
+%%------------------------------------------------------------------------------
+%% Application Internal Functions
+%%------------------------------------------------------------------------------
+%% @private
 -spec report(reporter(), passage_span:span()) -> ok.
-report({?MODULE, Module, State}, Span) ->
-    Module:report(Span, State),
+report(#?REPORTER{module = Module, state = State}, Span) ->
+    Module:report(State, Span),
     ok.
diff --git a/src/passage_reporter_null.erl b/src/passage_reporter_null.erl
index 4adc2cd..f7cd241 100644
--- a/src/passage_reporter_null.erl
+++ b/src/passage_reporter_null.erl
@@ -1,13 +1,30 @@
+%% @copyright 2017 Takeru Ohta <phjgt308@gmail.com>
+%%
+%% @doc TODO
+%%
 -module(passage_reporter_null).
 
 -behaviour(passage_reporter).
 
+%%------------------------------------------------------------------------------
+%% Exported API
+%%------------------------------------------------------------------------------
 -export([new/0]).
+
+%%------------------------------------------------------------------------------
+%% 'passage_reporter' Callback API
+%%------------------------------------------------------------------------------
 -export([report/2]).
 
+%%------------------------------------------------------------------------------
+%% Exported Functions
+%%------------------------------------------------------------------------------
 -spec new() -> passage_reporter:reporter().
 new() ->
     passage_reporter:new(?MODULE, undefined).
 
+%%------------------------------------------------------------------------------
+%% 'passage_reporter' Callback Functions
+%%------------------------------------------------------------------------------
 report(_, _) ->
     ok.
diff --git a/src/passage_tracer_registry.erl b/src/passage_tracer_registry.erl
index 1c93093..c738efc 100644
--- a/src/passage_tracer_registry.erl
+++ b/src/passage_tracer_registry.erl
@@ -57,6 +57,10 @@
       Reporter :: passage_reporter:reporter(),
       Reason :: already_registered | term().
 register(Tracer, Module, Sampler, Reporter) ->
+    Args = [Tracer, Module, Sampler, Reporter],
+    is_atom(Tracer) orelse error(badarg, Args),
+    passage_reporter:is_reporter(Reporter) orelse error(badarg, Args),
+
     gen_server:call(?MODULE, {register, {Tracer, Module, Sampler, Reporter}}).
 
 -spec deregister(passage:tracer_id()) -> ok.