or download this
use v5.14;
#my $fact = sub { (sub { goto &{$_[0]} })->(sub { $_[1] ? $_[1] * $_[0
+]($_[0], $_[1]-1) : 1 }, $_[0]) };
...
*fact = (sub { my ($auto_fun,) = @_; sub { $auto_fun->($auto_fun, @_)
+} })->( sub { my ($self, $value) = @_; $value ? $value * $self->($sel
+f, $value - 1) : 1 } );
say "Test fact: $_!=", fact($_) for 3, 4, 5;