$parameters * @return mixed * * @throws BadMethodCallException */ protected static function forwardCallTo($object, string $method, array $parameters) { try { return $object->{$method}(...$parameters); } catch (BadMethodCallException $e) { $pattern = '~^Call to undefined method (?P[^:]+)::(?P[^\(]+)\(\)$~'; if (! preg_match($pattern, $e->getMessage(), $matches)) { throw $e; } if ($matches['class'] != get_class($object) || $matches['method'] != $method) { throw $e; } static::throwBadMethodCallException($method); } } /** * Throw a bad method call exception for the given method. * * @return void * * @throws BadMethodCallException */ protected static function throwBadMethodCallException(string $method) { throw new BadMethodCallException(sprintf( 'Call to undefined method %s::%s()', static::class, $method )); } }