package PickDiff ; use strict ; use warnings ; # $like must be sub-ref ; predicate : sub (file-name) -> bool my $like = sub { die "PickDuff: don't know what to like" ; } ; sub set_like { my $self = shift ; $like = shift ; $like ; } sub TIEHANDLE { my ( $class, $fh ) = @_ ; bless { fh => $fh, like => 1 }, $class ; } sub READLINE { my $self = shift ; my $fh = $self -> {fh} ; my $line ; while ( 1 ) { $line = <$fh> ; return undef unless defined $line ; if ( $line =~ /^(Modified|Added|Deleted):/ ) { my $file = ( split ' ', $line ) [ 1 ] ; $self -> { like } = &$like ( $file ) ; } last if $self -> { like } ; } $line ; } sub CLOSE { close shift->{fh} or die $! ? "Error closing diff pipe: $!" : "Exit status $? from diff pipe" ; } 1 ;