input; } public function getOutputName(): string { return $this->output; } public function getTransformation(): callable { return $this->transformation; } public function setInputName(string $input): \ProVM\Concept\Model\Mapping { $this->input = $input; return $this; } public function setOutputName(string $output): \ProVM\Concept\Model\Mapping { $this->output = $output; return $this; } public function setTransformation(callable $transformation): \ProVM\Concept\Model\Mapping { $this->transformation = $transformation; return $this; } public function __invoke(mixed $input, mixed &$output, ?array $params = null): void { if (is_array($input)) { $input_value = $input[$this->getInputName()]; } if (is_a($input, Model::class)) { $input_value = $input->{$this->getInputName()}(); } $args = [$input_value]; if ($params !== null) { $args = array_merge($args, $params); } $output_value = call_user_func_array($this->getTransformation(), $args); if (is_array($output)) { $output[$this->getOutputName()] = $output_value; } if (is_a($output, Model::class)) { $output->{$this->getOutputName()}($output_value); } } }