NAME Object::RateLimiter - A flood control (rate limiter) object SYNOPSIS use Object::RateLimiter; my $ctrl = Object::RateLimiter->new( events => 3, seconds => 5 ); # Run some subs, as a contrived example; # no more than 3 in 5 seconds, per our constructor above: my @work = ( sub { "foo" }, sub { "bar" }, # ... ); while (my $some_item = shift @work) { if (my $delay = $ctrl->delay) { # Delayed $delay seconds. sleep $delay; } else { # No delay. $some_item->() } } # Clear the event history if it's stale: $ctrl->expire; # Clear the event history unconditionally: $ctrl->clear; DESCRIPTION This is a generic rate-limiter object, implementing the math described in in lightweight objects. new my $ctrl = Object::RateLimiter->new( events => 3, seconds => 5 ); Constructs a new rate-limiter with a clean event history. clone my $new_ctrl = $ctrl->clone( events => 4 ); Clones an existing rate-limiter; new options can be provided, overriding previous settings. The new limiter contains a clone of the event history; the old rate-limiter is left untouched. clear $ctrl->clear; Clears the event history. delay if (my $delay = $ctrl->delay) { sleep $delay; # ... or do something else } else { # Not delayed. do_work; } The "delay()" method determines if some work can be done now, or should wait. When called, a new event timestamp is recorded; if we've exceeded our limit, the current delay (in possibly-fractional seconds) until the event is allowed is returned. A return value of 0 indicates that the event does not need to wait. events Returns the events limit the object was constructed with. expire $ctrl->expire; Clears the event history if the last seen event is outside of our time window. (You're not required to call "expire()", but it can be useful to force a cleanup.) seconds Returns the seconds limit the object was constructed with. AUTHOR Jon Portnoy Based on the math from Algorithm::FloodControl as described in an article written by the author: Licensed under the same terms as Perl.