Next Higher-Order Perl 121 

Anonymous Subroutines as Objects

        sub make_bank_account {
          my ($name, $balance) = @_;
          return sub {
            my $method = shift;
            if      ($method eq 'deposit') {
              $balance += shift();
            } elsif ($method eq 'withdraw') {
              my $amount = shift;
              die "Negative withdrawal for account `$name'\n"
                if $amount < 0;
              die "Account `$name' overdrawn\n" 
                if $amount > $balance;
              $balance -= $amount;
            } elsif ($method eq 'balance') {
              return $balance;
            } elsif ($method eq 'name') {
              return $name;
            } else {
              die "Unknown method `$method' in bank account object";
            }
          };
        }
        my $freds_account = make_bank_account('Fred', 100.00);
        $freds_account->('deposit',  50.23);
        $freds_account->('withdraw', 20.11);
        $b = $freds_account->('balance');

Next Copyright © 2006 M. J. Dominus