public function client( $key = null ) {

		// check if we already set the client object
		if ( is_null( $this->client ) ) 
		{
			// make client 
			$this->client = new \stdClass;

			/*
			 * get clients ip address
			 */
			// Cloudlfare fix 
			if ( $this->has_server( 'HTTP_CF_CONNECTING_IP' ) ) 
			{
				$this->client->ip = $this->server( 'HTTP_CF_CONNECTING_IP' );
			}
			// proxy?
			elseif ( $this->has_server( 'HTTP_X_FORWARDED_FOR' ) ) 
			{
				$this->client->ip = $this->server( 'HTTP_X_FORWARDED_FOR' );
			} 
			// another proxy?
			elseif ( $this->has_server( 'HTTP_CLIENT_IP' ) )
			{
				$this->client->ip = $this->server( 'HTTP_CLIENT_IP' );
			}
			// or default
			else 
			{
				$this->client->ip = $this->server( 'REMOTE_ADDR', '127.0.0.1' );
			}

			/*
			 * set clients user agent
			 */
			$this->client->agent = $this->server( 'HTTP_USER_AGENT', '' );

			/*
			 * set clients port
			 */
			$this->client->port = $this->server( 'REMOTE_PORT', '' );

			/*
			 * set clients fingerprint based on host and agent
			 */
			$this->client->fingerprint = CCStr::hash( $this->client('agent').$this->client('ip') );

			/*
			 * set clients language
			 */
			$this->client->language = CCLang::set_current( $this->server( 'HTTP_ACCEPT_LANGUAGE' ) );
		}

		// return the object
		if ( is_null( $key ) ) 
		{
			return $this->client;
		}

		// return a special key
		return $this->client->{$key};
	}