The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Dancer::Cookies;
use strict;
use warnings;

use Dancer::Cookie;
use Dancer::SharedData;

# all cookies defined by the application are store in that singleton
# this is a hashref the represent all key/value pairs to store as cookies
my $COOKIES = {};
sub cookies {$COOKIES}

sub parse_cookie_from_env {
    my $request = Dancer::SharedData->request;
    my $env     = (defined $request) ? $request->env : {};
    my $env_str = $env->{COOKIE} || $env->{HTTP_COOKIE};
    return {} unless defined $env_str;

    my $cookies = {};
    foreach my $cookie (split('; ', $env_str)) {
        my ($name, $value) = split('=', $cookie);
        $cookies->{$name} =
          Dancer::Cookie->new(name => $name, value => $value);
    }
    return $cookies;
}

sub init {
    $COOKIES = parse_cookie_from_env();
}

# return true if the given cookie is not the same as the one sent by the client
sub has_changed {
    my ($self, $cookie) = @_;
    my ($name, $value) = ($cookie->{name}, $cookie->{value});

    my $client_cookies = parse_cookie_from_env();
    my $search         = $client_cookies->{$name};
    return 1 unless defined $search;
    return $search->value ne $value;
}

1;