/**
  * merge a single key into our array
  *
  * @param  array &$ours
  *         the array to merge into
  * @param  mixed $key
  *         the array key to merge into
  * @param  mixed $value
  *         the data to merge in
  * @return void
  */
 private static function mergeKeyIntoArray(&$ours, $key, $value)
 {
     // general case - overwrite because merging isn't possible
     if (ShouldOverwrite::intoArray($ours, $key, $value)) {
         $ours[$key] = $value;
         return;
     }
     // special case - we are merging into an object
     if (is_object($ours[$key])) {
         MergeIntoAssignable::from($ours[$key], $value);
         return;
     }
     // at this point, we are merging into an array, using recursion
     // for which I am going to hell
     MergeIntoIndexable::from($ours[$key], $value);
 }
 /**
  * @covers ::from
  * @dataProvider provideUnsupportedTypes
  */
 public function testStaticCallAppendsEverythingElseToArray($theirs)
 {
     // ----------------------------------------------------------------
     // setup your test
     $data = [];
     $expectedResult = [];
     $expectedResult[] = $theirs;
     // ----------------------------------------------------------------
     // perform the change
     MergeIntoIndexable::from($data, $theirs);
     // ----------------------------------------------------------------
     // test the results
     $this->assertEquals($expectedResult, $data);
 }
 /**
  * merge their data into one of our object's properties
  *
  * @param  object &$obj
  *         the object that we want to merge into
  * @param  string $property
  *         the property to merge into
  * @param  mixed $value
  *         the data that we want to merge from
  * @return void
  */
 public static function ofObject($obj, $property, $value)
 {
     // robustness!
     RequireAssignable::check($obj, E4xx_UnsupportedType::class);
     // easiest case - no clash
     if (ShouldOverwrite::intoObject($obj, $property, $value)) {
         $obj->{$property} = $value;
         return;
     }
     // special case - we are merging into an object
     if (is_object($obj->{$property})) {
         MergeIntoAssignable::from($obj->{$property}, $value);
         return;
     }
     // if we get here, then we must be merging into an array
     MergeIntoIndexable::from($obj->{$property}, $value);
 }