use strict; use warnings; use Data::Dumper; my $obj = MyTest->new(); #$obj->param('test', 555); #works fine #$obj->param('test2', 55522); #works fine $obj->param('test') = 555; $obj->param('test2') = 55522; my @params = $obj->param(); print Dumper(@params); package MyTest; sub new { bless { 'session' => {} }, shift; } sub param { my $self = shift; my $name = shift; my @val = @_; $self->{session}->{$name} = $val[0] if @_; unless(@val) { return keys %{$self->{session}} unless $name; return $self->{session}->{$name}; } } 1;