class TreeWatch { has %.taps; has IO $.root; has $.supplier; method new( IO() $root ) { my $ich = self.bless( :$root, supplier => Supplier.new ); $ich.taps{ $root } = $ich.scan( $root ); return $ich; } method retap( IO $path, &block ) { my $old = %.taps{$path}; %.taps{$path} = $path.watch.tap( &block ); $old.close if $old; } method scan( $dir ) { self.retap: $dir, { say "dir $dir tap fired"; self.scan( $dir ); $.supplier.emit( $_ ); }; for dir( $dir ) { if .IO.d { self.scan( $_ ); } else { self.retap( $_, { $.supplier.emit( $_ ) } ); } } } method Supply() { $.supplier.Supply; } }