anchor.diff:      maps:merge(DataObject1,?CL(DataObject2));
   merge(DataObject1,DataObject2) ->
       ?TO_JSON(merge(?FROM_JSON(DataObject1),?FROM_JSON(DataObject2))).
  +-else.
  +merge(DataObject1,DataObject2) when is_list(DataObject1), is_list(DataObject2) ->
  +    CleanObject2 = ?CL(DataObject2),
  +    Object2Keys = proplists:get_keys(CleanObject2),
  +    CleanObject2 ++ [{K,V} || {K,V} <- DataObject1, lists:member(K,Object2Keys) =:= false];
  +merge(DataObject1,DataObject2) ->
  +    ?TO_JSON(merge(?FROM_JSON(DataObject1),?FROM_JSON(DataObject2))).
  +-endif.
  +
   
   %% @doc creates a diff data object between the first (old) and second (new) provided data
   %% objects. null values are ignored. Resulting data object will have 5 root keys, each containg
  
positive.code:              DataObject);
  exclude(Keys,DataObject) ->
      ?TO_JSON(exclude(Keys,?FROM_JSON(DataObject))).
  
  %% @doc Merges two data objects into a data object. 
  %% If two keys exists in both data objects  the value in the first data object
  %% will be superseded by the value in the second data object, unless the value 
  %% of the second data object is null.
  -spec merge(data_object(),data_object()) -> data_object().
  merge(DataObject1,DataObject2) when is_list(DataObject1), is_list(DataObject2) ->
      CleanObject2 = ?CL(DataObject2),
      Object2Keys = proplists:get_keys(CleanObject2),
  
negative.code: equal(DataObject1, DataObject2) ->
      equal(?FROM_JSON(DataObject1),?FROM_JSON(DataObject2)).
      
  -else.
  equal(DataObject1, DataObject2) when is_list(DataObject1), is_list(DataObject2) -> 
      lists:sort(?CL(DataObject1)) =:= lists:sort(?CL(DataObject2));
  equal(DataObject1, DataObject2) ->
      equal(?FROM_JSON(DataObject1),?FROM_JSON(DataObject2)).
      
  -endif.
  
  
  %% @doc Returns true when every element of data_object1 is also a member of data_object2, otherwise false.
  -spec is_subset(data_object(), data_object()) -> boolean().
  -ifdef(ALLOW_MAPS).
  is_subset(DataObject1, DataObject2) when is_list(DataObject1), is_list(DataObject2) ->
      Is_Member = fun ({_,null}) -> true;
                      ({K1,V1}) -> V1 =:= proplists:get_value(K1,DataObject2) end,
  