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();