$c->user_existsと$c->userについて*[CPAN][Catalyst]

(途中)

Catalyst::Plugin::Authenticationの設定値として、
use_sessionというものがあります。

use_session 

Whether or not to store the user's logged in state in the session, 
if the application is also using the Catalyst::Plugin::Session plugin. 
This value is set to true per default.

と、CPANには書かれているのですが、設定することでどのフローが変わるのか、よくわかりません。
で、調べてみて、一言で言うと、
(※Catalyst::Plugin::Authentication::Store::DBICを使う場合)

『もしセッションがあれば、認証チェック[$c->user_exists]のときに、
 セッションに$c->session->{__user}があれば認証OKとみなすYO!』

ってことです。
要するに、認証が通っているかどうかは、session->{__user}があるかないか イコール
sessionkeyである、cookieがあるかないかで判断される、ということです。

カニズムは非常にシンプル。

一方、$c->userのフローに目を向けてみると、

$c->userでは、 $c->session->{__user}の値で、(login_id)でサーチを行います。
ここで食い違いがあると、

$c->user内で$c->get_userは、

sub get_user {
  $c->{auth}{catalyst_user_class}->new( $id, @rest );

{デフォルトでは、catalyst_user_class = Catalyst::Plugin::Authentication::Store::DBIC::User}

sub new {
  my ( $class, $id, $config ) = @_; 

なので、
catalyst_user_classのnew(実際にdbアクセスするところ)は、

  1. $c->login(Credential::Password)
  2. $c->user(Authentication)

の2つから利用されることになります。

したがって、catalyst_user_classを拡張する場合に、
newメソッドを、ログインフォームからのことだけを考えて実装してはだめで、
$c->userとして、sessionに入っているlogin_idもこの引数となることを前提にしなければなりません。

ここでかなりはまりましたwww