/**
  * @test
  */
 public function test_evaluate_field_with_formatting()
 {
     $obj = new Target\PrivateClass(new \DateTime('2015/12/13 14:15:36', new \DateTimeZone('Asia/Tokyo')), 'bb', 999, 12345, 'xyz');
     $evaluator = new Strategy\ObjectFieldEvaluator($obj, []);
     $formatter = new \JsonEncoder\Formatter\DateTimeFormatter();
     $this->assertEquals(['a' => '2015-12-13T14:15:36+0900', 'b' => 'bb'], $evaluator->evaluate(['a', 'b'], [\DateTime::class => $formatter]));
 }
 /**
  * {inheritdoc}
  */
 public function serialize($value, array $formatters)
 {
     if (!is_object($value)) {
         return [];
     }
     $evaluator = new ObjectFieldEvaluator($value);
     if ($this->rule->isFieldAllIncludes()) {
         $this->rule->includes($evaluator->listFields());
     }
     return $evaluator->evaluate($this->rule->listIncludeFields(), $formatters);
 }
 /**
  * {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;
 }