#!/usr/bin/perl package FunkOpera; use overload '&' => sub { my ($l, $r, $f) = @_; bless $f ? sub {&{$r} && &{$l}} : sub {&{$l} && &{$r}} , __PACKAGE__ }, '|' => sub { my ($l, $r, $f) = @_; bless $f ? sub {&{$r} || &{$l}} : sub {&{$l} || &{$r}} , __PACKAGE__ }, '!' => sub { my ($fn) = @_; bless sub { ! &{$fn}}, __PACKAGE__ }; 1; #### package main; my $foo = bless sub { $_[0] =~ /foo/ }, FunkOpera; my $bar = sub {"bar"}; my %funk; @funk{qw/foonbar foorbar barnfoo barrfoo/} = ($foo & $bar, $foo | $bar, $bar & $foo, $bar | $foo); for (keys %funk) { print qq($_("food") returns ), $funk{$_}->('food'}, $/; print qq($_("ford") returns ), $funk{$_}->('ford'}, $/; } __END__ foorbar("food") returns 1 foorbar("ford") returns bar barnfoo("food") returns 1 barnfoo("ford") returns foonbar("food") returns bar foonbar("ford") returns barrfoo("food") returns bar barrfoo("ford") returns bar