#!/usr/bin/perl use strict; use warnings; package Foo; sub new { my $class=shift; my $self={}; $self->{count}=0; bless($self,$class); return $self; } sub counter { my $self=shift; if(@_) { my $opt=shift; my $val=@_?shift(@_):undef; return 0 unless($opt=~/^[+-=]{1,2}|^\d+$/ ); if($opt eq '=') { return 0 unless(defined($val)); $self->{count}=$val+0; } elsif($opt eq '+=') { return 0 unless(defined($val)); $self->{count}+=$val; } elsif($opt eq '-=') { return 0 unless(defined($val)); $self->{count}-=$val; } elsif($opt eq '++') { $self->{count}++; } elsif($opt eq '--') { $self->{count}--; } elsif($opt=~/^\d+$/) { $self->{count}=$opt; } else { return 0; } return 1; } else { return $self->{count}; } } package main; my $val=Foo->new(); $val->counter( 3 ); print $val->counter."\n"; $val->counter('++'); print $val->counter."\n"; $val->counter('--'); print $val->counter."\n"; $val->counter qw( = 10); print $val->counter."\n"; $val->counter qw( += 5 ); print $val->counter."\n"; $val->counter qw( -= 20 ); print $val->counter."\n";