package MyPackage; sub new { my $self = $_[0]; bless { foo => $_[1] }, ref($self) || $self; } package main; my $a = MyPackage::->new(1); #### package main; my $b = $a; #### my $c = $a + $b; #### package MyPackage; use overload q/+/ => \&add; sub add { $_[0]->new( $_[0]->{foo} + (ref($_[1]) ? $_[1]->{foo} : $_[1]) ) } #### package main; my $c = $a + $b; #### $b++; #### package MyPackage; use overload q/++/ => sub { $_[0]->{foo}*=2; shift }; package main; $d = $c; $d++; #### package MyPackage; use overload q/=/ => sub { $_[0]->new($_[0]->{foo}) }; #### package main; $d = $c; #### $d++;