map($item, $method->createResultObject()); } return $return; } /** * Map response data to instance of ResultObjectInterface * @param array $response * @param ResultObjectInterface $result * * @return ResultObjectInterface */ public function map(array $response, ResultObjectInterface $result) { foreach ($response as $field => $value) { $method = $this->getSetterName($field); if (!method_exists($result, $method)) { throw new Exception\ResultObjectInterfacePropertyNotFound( sprintf( 'Result object %s property "%s" not found.', get_class($result), $field ) ); } if ($field == 'payment_instrument') { $value = $this->transformPaymentInstrumentValue($value, $response['payment_method']); } elseif ($field == 'authorization_information') { $value = $this->transformAuthorizationInformationValue($value); } $result->$method($value); } return $result; } /** * Extracts camelCased setter name from underscore notation. * Eg. my_field_name => myFieldName * @param string $field * @return string */ private function getSetterName($field) { $parts = explode('_', $field); array_map('ucfirst', $parts); $name = 'set' . implode('', $parts); return $name; } /** * Transform PaymentInstrument result array to object * @param array $data * @param string $method * @return PaymentInstrumentCard|PaymentInstrumentRecurring * @throws Exception\Runtime for unsupported methods */ private function transformPaymentInstrumentValue(array $data, $method) { if ($method == 'card') { $instrument = new PaymentInstrumentCard(); } elseif ($method == 'recurring') { $instrument = new PaymentInstrumentRecurring(); } else { throw new Exception\Runtime(sprintf('Method "%s" is not supported', $method)); } $this->map($data, $instrument); return $instrument; } /** * Transform AuthorizationInformation result array to object * @param array $data * @return AuthorizationInformation */ private function transformAuthorizationInformationValue($data) { $info = new AuthorizationInformation(); $this->map($data, $info); return $info; } }