函数参数传递的疑问

函数参数传递的疑问
看大骆驼书里的一个例子,不太明白

package ClipByte;

use overload '+' => \&clip_add,
'-' => \&clip_sub;

sub new {
my $class = shift;
my $value = shift;
return bless \$value => $class;
}

sub clip_add {
my ($x, $y) = @_;
my ($value) = ref($x) ? $$x : $x;
$value += ref($y) ? $$y :$y;
$value = 255 if $value > 255;
$value = 0 if $value < 0;
return bless \$value => ref($x);
}

sub clip_sub {
my ($x, $y, $swap) = @_;
my ($value) = (ref $x) ? $$x : $x;
$value -= (ref $y) ? $$y : $y;
print "$value,$swap\n-------------------------------------\n";
if ($swap) { $value = -$value } #为什么会这样?不是只有两个参数吗,怎么又跑出来3个,而且为什么$x,$y的值为什么不是150,100,而是反的?
$value = 255 if $value > 255;
$value = 0 if $value < 0;

return bless \$value => ref($x);
}

package main;

$byte1 = ClipByte->new(200);
$byte2 = ClipByte->new(100);

$byte3 = $byte1 + $byte2; # 255
$byte4 = $byte1 - $byte2; # 100
$byte5 = 150 - $byte2; # 50