use strict; use warnings; my @array_1 = ("tom","harry","diana","nick","sally","henry"); my @obj = map { new Person (name=>$_) } @array_1; $_->action() for @obj; #------------------------------ BEGIN{ package Person; my $actionIndex=0; my @actions = qw (play eat sleep); my %actsub; sub new{ my ($class, %args )= @_; return bless { ACTION => $actions[$actionIndex++ % scalar @actions], %args, }, $class; } sub action{ my $self = shift; $actsub{ $self->{ACTION} }->($self,@_); } # Initialize class ... for my $actname (@actions){ $actsub{$actname} = sub { my $self = shift; print $self->{name} . " likes to $actname\n"; } } 1; } #### tom likes to play harry likes to eat diana likes to sleep nick likes to play sally likes to eat henry likes to sleep