The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Module::New::Queue;

use strict;
use warnings;

our $QUEUE = [];

sub localize {
  my ($class, $code) = @_;

  local $QUEUE = [];
  $code->();
}

sub register {
  my ($class, $code) = @_;

  push @{ $QUEUE }, $code;
}

sub consume {
  my ($class, @args) = @_;

  while ( my $func = shift @{ $QUEUE } ) {
    $func->( @args );
  }
}

sub queue { @{ $QUEUE } }
sub clear { $QUEUE = [] }

1;

__END__

=head1 NAME

Module::New::Queue

=head1 SYNOPSIS

  use Module::New::Queue;

  Module::New::Queue->register(sub { print "global\n" });
  Module::New::Queue->localize(sub {
    Module::New::Queue->register(sub { print "local\n" });
    Module::New::Queue->consume(@args); # consume local queue
  });
  Module::New::Queue->consume(@args); # consume global queue

=head1 DESCRIPTION

Used internally to register commands.

=head1 METHODS

=head2 localize

runs a code reference with a localized queue.

=head2 register

register a code reference to the queue.

=head2 consume

consumes the code references in the queue.

=head2 queue

returns an array of the registered code references.

=head2 clear

clears the queue.

=head1 AUTHOR

Kenichi Ishigaki, E<lt>ishigaki@cpan.orgE<gt>

=head1 COPYRIGHT AND LICENSE

Copyright (C) 2009 by Kenichi Ishigaki.

This program is free software; you can redistribute it and/or
modify it under the same terms as Perl itself.

=cut