anchor.diff:  %% replaced : containts key/value pairs who are not indentical between data object 1 and 2,
   %%            with the values from data object 1
   -spec diff(data_object(), data_object()) -> diff_object().
  +-ifdef(ALLOW_MAPS).
   diff(RawDataObject1, RawDataObject2) when is_list(RawDataObject1), is_list(RawDataObject2) ->
       DataObject1 = ?CL(RawDataObject1),
       DataObject2 = ?CL(RawDataObject2),
  
positive.code:     end;
  get(Key,DataObject,Default) ->
      get(Key,?FROM_JSON(DataObject), Default).
  
  
  %% @doc Check if data object has key
  -spec has_key(key(), data_object()) -> boolean().
  has_key(Key,DataObject) when is_list(DataObject) ->
      proplists:is_defined(Key,DataObject);
  has_key(Key,DataObject) when is_map(DataObject) ->
      maps:is_key(Key,DataObject);
  has_key(Key,DataObject) -> 
      has_key(Key,?FROM_JSON(DataObject)).
  
  
  %% @doc Erlang term ordered list of keys used by data object
  -spec keys(data_object()) -> list().
  keys(DataObject) when is_list(DataObject) -> 
      lists:sort(proplists:get_keys(DataObject));
  keys(DataObject) when is_map(DataObject) -> 
      lists:sort(maps:keys(DataObject));
  keys(DataObject) -> 
      keys(?FROM_JSON(DataObject)).
  
  %% @doc Produces a new data object by calling the function fun F(K, V1) 
  %% for every K to value V1 association in data object in arbitrary order. 
  
negative.code:      {"json_fail",?_assert(not is_disjoint(Sub_Nook_Json,?TEST_JSON))}].
  -endif.
  
  -endif.
  