# Dereference so that they can't go behind our backs sub fields { return @{ $self->{_fields} } } sub add_field { my ( $self, $field ) = @_; push @{ $self->{_fields} }, $field; $self->{_fields_hash}->{ $field } = scalar @{ $self->{_fields} } - 1; } sub remove_field { my ( $self, $field ) = @_; my $idx = $self->field_exists( $field ); return unless ( $idx ); delete $self->{_fields_hash}->{ $field }; splice( @{ $self->{_$fields} }, $idx, 1 ); } sub field_exists { my ( $self, $field ) = @_; return $self->{_fields_hash}->{ $field }; }