*/ final class TimedGeocoder implements Geocoder { use GeocoderTrait; /** * @var Provider */ private $delegate; /** * @var Stopwatch */ private $stopwatch; public function __construct(Provider $delegate, Stopwatch $stopwatch) { $this->delegate = $delegate; $this->stopwatch = $stopwatch; } /** * {@inheritdoc} */ public function geocodeQuery(GeocodeQuery $query): Collection { $this->stopwatch->start('geocode', 'geocoder'); try { $result = $this->delegate->geocodeQuery($query); } catch (\Throwable $e) { $this->stopwatch->stop('geocode'); throw $e; } $this->stopwatch->stop('geocode'); return $result; } /** * {@inheritdoc} */ public function reverseQuery(ReverseQuery $query): Collection { $this->stopwatch->start('reverse', 'geocoder'); try { $result = $this->delegate->reverseQuery($query); } catch (\Throwable $e) { $this->stopwatch->stop('reverse'); throw $e; } $this->stopwatch->stop('reverse'); return $result; } public function __call($method, $args) { return call_user_func_array([$this->delegate, $method], $args); } public function getName(): string { return 'timed_geocoder'; } }