public function sign_in( \Auth\User $user, $keep_login = true ) 
	{
		// set the session key so the session knows we are logged in
		$this->session->set( $this->config->session_key, $user->{$this->config->user_key} );

		// update the current user object
		$this->user = $user;

		// update the last login timestamp
		$this->user->last_login = time();

		// pass the user trough the events to allow modifications
		// of the user object at sign in
		$this->user = \CCEvent::pass( 'auth.sign_in', $this->user );

		// save the user object to the database 
		$this->user->save();

		// set the restore keys to keep the login
		// after the session ends
		if ( $keep_login ) 
		{
			$restore_id_cookie = $this->config->get( 'restore.id_cookie' );
			$restore_token_cookie = $this->config->get( 'restore.token_cookie' );

			$restore_lifetime = $this->config->get( 'restore.lifetime' );

			$restore_id = $this->session->get( $this->config->session_key );
			$restore_token = $this->restore_key( $this->user );

			CCCookie::set( $restore_id_cookie, $restore_id, $restore_lifetime );
			CCCookie::set( $restore_token_cookie, $restore_token, $restore_lifetime );

			// try to get the current login
			$login = $this->select_logins()
				->where( 'restore_id', $restore_id )
				->where( 'restore_token', $restore_token );

			// prepare the login data
			$login_data = array(
				'restore_id' 		=> $restore_id,
				'restore_token' 		=> $restore_token,
				'last_login' 		=> time(),
				'client_agent'		=> \CCIn::client()->agent,
			);

			// pass the login data trough the events
			$login_data = \CCEvent::pass( 'auth.store_login', $login_data );

			// if there is no such login create a new one
			if ( !$login->run() ) 
			{
				\DB::insert( $this->config->get( 'logins.table' ), $login_data )
					->run( $this->config->get( 'logins.handler' ) );
			}
			else 
			{
				\DB::update( $this->config->get( 'logins.table' ), $login_data )
					->where( 'restore_id', $restore_id )
					->where( 'restore_token', $restore_token )
					->run( $this->config->get( 'logins.handler' ) );
			}
		}

		// and finally we are authenticated
		return $this->authenticated = true;
	}