Index: lib/POE/Wheel/FollowTail.pm
===================================================================
--- lib/POE/Wheel/FollowTail.pm	(revision 2158)
+++ lib/POE/Wheel/FollowTail.pm	(working copy)
@@ -483,6 +483,49 @@
   return $handle;
 }
 
+sub set_filter {
+  my ($self, $new_filter) = @_;
+
+  # Switch filters, preserving the old one's input buffer.
+  my $old_input_filter = $self->[SELF_FILTER];
+  my $buf = $old_input_filter->get_pending();
+  $self->[SELF_FILTER] = $new_filter;
+
+  # If the new filter implements "get_one", use that.
+  if (
+    $new_filter->can('get_one') and
+    $new_filter->can('get_one_start')
+  ) {
+    if (defined $buf) {
+      $self->[SELF_FILTER]->get_one_start($buf);
+      while ($self->[SELF_FILTER] == $new_filter) {
+        my $next_rec = $self->[SELF_FILTER]->get_one();
+        last unless @$next_rec;
+        foreach my $cooked_input (@$next_rec) {
+          $poe_kernel->call(
+            $poe_kernel->get_active_session(),
+            $self->[SELF_EVENT_INPUT],
+            $cooked_input, $self->[SELF_UNIQUE_ID]
+          );
+        }
+      }
+    }
+  }
+
+  # Otherwise use the old behavior.
+  else {
+    if (defined $buf) {
+      foreach my $cooked_input (@{$self->[SELF_FILTER]->get($buf)}) {
+        $poe_kernel->call(
+          $poe_kernel->get_active_session(),
+          $self->[SELF_EVENT_INPUT],
+          $cooked_input, $self->[SELF_UNIQUE_ID]
+        );
+      }
+    }
+  }
+}
+
 ###############################################################################
 1;
 
