Concierge
view release on metacpan or search on metacpan
lib/Concierge/User.pm view on Meta::CPAN
$self->{user_data} = $options->{user_data} if $options->{user_data};
# Store closures for backend access (if logged-in user)
$self->{_get_user_data} = $options->{_get_user_data} if $options->{_get_user_data};
$self->{_update_user_data} = $options->{_update_user_data} if $options->{_update_user_data};
# Determine user type (for status methods)
$self->{is_visitor} = !$options->{session} && !$options->{user_data};
$self->{is_guest} = $options->{session} && !$options->{user_data};
$self->{is_logged_in} = $options->{session} && $options->{user_data};
return $self; # Return blessed object directly (not wrapped)
}
# =============================================================================
# IDENTITY & METADATA - Direct scalar returns
# =============================================================================
sub user_id ($self) {
return $self->{user_id};
}
sub user_key ($self) {
return $self->{user_key};
}
sub session_id ($self) {
return $self->{session_id}; # undef if visitor/no session
}
# =============================================================================
# STATUS METHODS - Direct boolean returns
# =============================================================================
sub is_visitor ($self) {
return $self->{is_visitor} ? 1 : 0;
}
sub is_guest ($self) {
return $self->{is_guest} ? 1 : 0;
}
sub is_logged_in ($self) {
return $self->{is_logged_in} ? 1 : 0;
}
# =============================================================================
# SESSION ACCESS - Returns session object
# =============================================================================
sub session ($self) {
return $self->{session}; # undef if no session (visitor)
}
sub get_session_data ($self) {
return undef unless $self->{session};
my $result = $self->{session}->get_data();
return $result->{value} // {};
}
sub update_session_data ($self, $updates) {
return undef unless $self->{session};
my $result = $self->{session}->get_data();
my $current = $result->{value} // {};
# Merge updates into current data
for my $key (keys %$updates) {
$current->{$key} = $updates->{$key};
}
$self->{session}->set_data($current);
$self->{session}->save();
return 1;
}
# =============================================================================
# USER DATA - Quick access from memory snapshot
# =============================================================================
sub moniker ($self) {
return $self->{user_data}{moniker};
}
sub email ($self) {
return $self->{user_data}{email};
}
sub user_status ($self) {
return $self->{user_data}{user_status};
}
sub access_level ($self) {
return $self->{user_data}{access_level};
}
sub get_user_field ($self, $field) {
return $self->{user_data}{$field};
}
# =============================================================================
# USER DATA - Backend operations via closures
# =============================================================================
sub refresh_user_data ($self) {
# Fetch fresh data from backend, update memory snapshot
return undef unless $self->{_get_user_data};
my $result = $self->{_get_user_data}->();
return undef unless $result->{success};
$self->{user_data} = $result->{user};
return 1;
}
sub update_user_data ($self, $updates) {
# Update backend AND memory snapshot
return undef unless $self->{_update_user_data};
my $result = $self->{_update_user_data}->($updates);
return undef unless $result->{success};
# Update memory snapshot with new values
for my $field (keys %$updates) {
$self->{user_data}{$field} = $updates->{$field};
}
return 1;
}
1;
__END__
=head1 NAME
Concierge::User - User object enabled by Concierge
=head1 VERSION
v0.6.1
=head1 SYNOPSIS
# User objects are created by Concierge lifecycle methods,
# not directly by applications.
my $login = $concierge->login_user({
user_id => 'alice',
password => 'secret123',
});
my $user = $login->{user};
# Identity
say $user->user_id; # "alice"
say $user->user_key; # random token
say $user->session_id; # random hex string
# Status
say $user->is_logged_in; # 1
say $user->is_guest; # 0
say $user->is_visitor; # 0
# User data (from memory snapshot)
say $user->moniker;
say $user->email;
say $user->get_user_field('role');
# Update user data (writes to backend and memory)
$user->update_user_data({ theme => 'dark' });
# Refresh from backend
$user->refresh_user_data;
# Session data (get, merge-update, save in one call)
my $data = $user->get_session_data;
( run in 0.993 second using v1.01-cache-2.11-cpan-39bf76dae61 )