The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
NAME
    Pointy::Counter - funny syntax for loops

SYNOPSIS
      use Pointy::Counter;

      my $i = counter;
      while ($i --> 10)
      {
        say "\$i is $i";
      }
  
      # says $i is 1
      # says $i is 2
      # ...
      # says $i is 10

DESCRIPTION
    Pointy::Counter is a class that provides objects which seem to act like
    numbers, but have a special "-->" operator to count up to a particular
    value.

    OK, confession time... "-->" is not really an operator. It's a
    post-increment followed by a greater than sign.

      $i --> 10

    is parsed by Perl like:

      ($i--) > 10

    Then the Pointy::Counter class overloads "--" to increment rather than
    decrement, and overloads ">" to act as a less-than. If you try to
    perform any other maths, it should just act as a normal scalar. In
    particular, note that this means that while "$i--" will do a counter
    increment; "$i -= 1" will act completely differently, decrementing the
    counter and restoring it to a normal Perl scalar.

  Constructor
    "Pointy::Counter->new($initial)"
        Creates a new counter, with the initial value (defaults to 0). Note
        that the counter will have value $initial before the loop starts,
        but within the body of the loop, it will be "$initial+1",
        "$initial+2", etc.

    "counter $initial"
        This module exports a function which can be called as a shortcut for
        the constructor.

  Methods
    "value"
        Returns current value as a plain old Perl scalar. This is an lvalue
        subroutine, so you can, for example, reset a counter using:

         $i->value = 0;

    "continue"
        Really does decrement the counter. This is used to solve a small
        niggling problem:

         my $x = counter;       
         while ($x --> 2)
         {
           say "Counter is $x (loop A)";
         }
         while ($x --> 4)
         {
           say "Counter is $x (loop B)";
         }

        Will output:

         Counter is 1 (loop A)
         Counter is 2 (loop A)
         Counter is 4 (loop B)

        Why doesn't it output a line for when its value is 3? That's because
        it only takes the value 3 *between* the two loops. The solution is
        to decrement the counter before starting loop B:

         my $x = counter;       
         while ($x --> 2)
         {
           say "Counter is $x (loop A)";
         }
         $x -> continue;
         while ($x --> 4)
         {
           say "Counter is $x (loop B)";
         }

        This gives you:

         Counter is 1 (loop A)
         Counter is 2 (loop A)
         Counter is 3 (loop B)
         Counter is 4 (loop B)

BUGS
    Please report any bugs to
    <http://rt.cpan.org/Dist/Display.html?Queue=Pointy-Counter>.

SEE ALSO
    overload, perlsyn.

AUTHOR
    Toby Inkster <tobyink@cpan.org>.

COPYRIGHT AND LICENCE
    This software is copyright (c) 2011 by Toby Inkster.

    This is free software; you can redistribute it and/or modify it under
    the same terms as the Perl 5 programming language system itself.

DISCLAIMER OF WARRANTIES
    THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED
    WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
    MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.