{ package WidgetPool; my %widget_state; sub init { @widget_state{ @_ } = (0) x @_; } sub set_running { @widget_state{ @_ } = (1) x @_; } sub replace { my( $out, $in ) = @_; $widget_state{$out} = 0; $widget_state{$in} = 1; } sub is_running { my( $w ) = @_; $widget_state{$w} } } my @widgets = qw( foo bar baz blort blah plugh xyzzy arfle barfle gloop ); my @running = qw( foo bar baz ); WidgetPool::init( @widgets ); WidgetPool::set_running( @running ); # stand down 'foo', stand up $w: WidgetPool::is_running('foo') or croak "Um, 'foo' not running.\n"; WidgetPool::replace( 'foo', $w );