sub rcurry { my ($f, @args) = @_; return sub { $f->(@_, @args) }; } *company_name = &rcurry(\&wrap_with_html, "FoxTrotUniform Inc."); print company_name('B'); print company_name('I'); print company_name('H1'); #### sub conjoin { my ($f, $f2) = @_; return sub { $f->(@_) && $f2->(@_) } } sub disjoin { my ($f, $f2) = @_; return sub { $f->(@_) || $f2->(@_) } } *company_name_better = disjoin( conjoin( sub { return 1 if scalar @_ == 0 }, curry(\&company_name, 'H1') ), \&company_name ); print company_name_better('B'); print company_name_better();