public function get()
 {
     $context = Context::factory();
     // get default parameters from config
     $config = $context->ns('geocodit');
     $defaultProfile = $config->getValue('trust', 'geocodit', $this->VALID_PROFILE());
     $defaultAddress = $config->getValue('defaultAddress', 'Via Montefiori 13, Esino Lario', FILTER_SANITIZE_STRING);
     $penality = $config->getValue('penality', 2, $this->VALID_PENALITY());
     // get input patrameters from URL quesry string
     $input = $context->ns(INPUT_GET);
     $query = $input->getValue('q', $defaultAddress, FILTER_SANITIZE_STRING);
     $profile = $input->getValue('trust', $defaultProfile, self::VALID_PROFILE());
     $geocoder = new \Geocoder\ProviderAggregator();
     $adapter = new \Ivory\HttpAdapter\CurlHttpAdapter();
     // chain all supported providers
     $chain = new \Geocoder\Provider\Chain(array());
     foreach ($this->PROFILES[$profile] as $providerName) {
         $provider = $this->geocoderFactory($adapter, trim($providerName));
         $chain->add($provider);
     }
     $geocoder->registerProvider($chain);
     // Call toponym resolution providers
     $address = $geocoder->limit(1)->geocode($query)->first();
     // apply penality (just to avoid abuse, set to 0 in config file to disable)
     if ($penality > 0) {
         usleep($penality * 1000000);
     }
     return $this->stateTransfer($address);
 }