The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Counter;
use Squatting;

package Counter::Controllers;
use strict;
use Tie::IxHash::FixedSize;
use UUID::Random;
use Data::Dump 'pp';

our @C = (
       C(
               Home => [ '/' ],
               get => sub {
                       my ($self) = @_;
                       $self->redirect(R('Count'));
               },
       ),

       C(
               Count => [ '/@count' ],
               get => sub {
                       my ($self) = @_;
                       my $cr     = $self->cr;
                       my $log = $self->log;

                       my %p = (
                               i => 1
                       );
                       my %callbacks;
                       tie my %history, 'Tie::IxHash::FixedSize', {size => 10};

                       my $get_new_ci = sub {
                               my $ci = -1;
                               return sub {
                                       $ci++ if ($ci <= ($cr->param('ci') || $ci));
                                       return $ci;
                               }
                       }->();
                       $history{$get_new_ci->()} = {%p};
                       sub gen_link {
                               my ($text, $code) = @_;
                               my $uuid = UUID::Random::generate;
                                       $callbacks{$uuid} = $code;
                               return qq|<a href="?cb=$uuid&ci=|.($get_new_ci->()).qq|">$text</a>|;
                       }
                       sub process_links {
                               my $cr = shift;
                               my $cb = $cr->param('cb');
                               my $ci = ($cr->param('ci') || 0);
                               $log->debug($ci);
                               if(defined $cb) {
                                       if (exists $callbacks{$cb}
                                               &&      ref($callbacks{$cb}) eq "CODE") {
                                               $callbacks{$cb}->($cr);
                                               delete $callbacks{$cb};
                                               $history{$ci} = {%p};
                                       }       elsif (exists $history{$ci}) {
                                               %p = %{$history{$ci}};
                                       }
                               }
                       }

                       while (1) {
                               process_links($cr);
                               $cr->print(gen_link('next' => sub {
                                               $p{i}++;
                               }));
                               $cr->print("<br />");
                               $cr->print(gen_link('prev' => sub { $p{i}-- }));
                               $cr->print("<br />");
                               $cr->print($p{i});
                               $cr->print("<br />");
                               $cr->next;
                       }
               },
               continuity => 1,
       )
);

1;