#!/usr/bin/perl use strict; use warnings; use Data::Dumper; package Foo; sub new { my $class = shift; my $self = { items => \@_ }; return bless $self, $class; } sub add_method { my $self = shift; my $name = shift; die unless $name and $name =~ /^\w+$/; eval ( sub $name { my $self = shift; my $item = $name; return [ @{$self->{items}}, $item ]; } ); } package main; my $foo = Foo->new(qw/foo bar/); print Dumper $foo; $foo->add_method('buz'); print Dumper $foo->buz;