#!/usr/bin/perl
use 5.016;
use warnings;
use Scalar::Util qw(dualvar looks_like_number);

sub _fizz_buzz {
	dualvar($_[0],
		($_[0] % $_[1] ?
			"$_[0]" :
			(looks_like_number("$_[0]") ? $_[2] : $_[0] . $_[2])
		)
	)
}

sub fizz { _fizz_buzz($_[0], 3, 'Fizz') }
sub buzz { _fizz_buzz($_[0], 5, 'Buzz') }
sub gizz { _fizz_buzz($_[0], 7, 'Gizz') }

say buzz fizz 1;
say buzz fizz 3;
say buzz fizz 5;
say buzz fizz 15;
say buzz fizz 998;

say gizz buzz fizz 7;
say gizz buzz fizz 21;
say gizz buzz fizz 35;
say gizz buzz fizz 105;
say buzz gizz fizz 105;

say buzz(fizz(1)) + 2;
say fizz(buzz(fizz(1)) + buzz(2));
say gizz(buzz(fizz(15))) . "XXX";
