/**
  * @test
  */
 public function test_evaluate_object_field()
 {
     $obj = new Target\PrivateClass('aa', 'bb', 999, 12345, 'xyz');
     $evaluator = new Strategy\ObjectFieldEvaluator($obj);
     $this->assertTrue($evaluator->hasField('a'));
     $this->assertFalse($evaluator->hasField('b'));
     $this->assertFalse($evaluator->hasField('c'));
     $this->assertFalse($evaluator->hasField('d'));
     $this->assertFalse($evaluator->hasField('e'));
     $this->assertFalse($evaluator->hasGetter('a'));
     $this->assertTrue($evaluator->hasGetter('b'));
     $this->assertFalse($evaluator->hasGetter('c'));
     $this->assertFalse($evaluator->hasGetter('d'));
     $this->assertFalse($evaluator->hasGetter('e'));
     $this->assertFalse($evaluator->hasGetter('getA'));
     $this->assertFalse($evaluator->hasGetter('getB'));
     $this->assertFalse($evaluator->hasGetter('getC'));
     $this->assertTrue($evaluator->hasGetter('getD'));
     $this->assertFalse($evaluator->hasGetter('getE'));
     $this->assertEquals([true, 'aa'], $evaluator->evaluateField('a'));
     $this->assertEquals([true, 'bb'], $evaluator->evaluateField('b'));
     $this->assertEquals([false, null], $evaluator->evaluateField('c'));
     $this->assertEquals([true, 12345], $evaluator->evaluateField('d'));
     $this->assertEquals([false, null], $evaluator->evaluateField('e'));
 }
 /**
  * {inheritdoc}
  */
 public function serialize($value, array $formatters)
 {
     if (!is_object($value)) {
         return [];
     }
     $evaluator = new ObjectFieldEvaluator($value);
     $value1 = $this->builtin !== null ? $this->builtin->serialize($value, $formatters) : [];
     $value2 = array_reduce(array_keys($this->strategies), function (&$tmp, $f) use($evaluator, $formatters) {
         list($valid, $v) = $evaluator->evaluateField($f);
         return $valid ? $tmp + [$f => $this->strategies[$f]->serialize($v, $formatters)] : $tmp;
     }, []);
     return $value1 + $value2;
 }