sub mk_accessors { my($self, @fields) = @_; $self->_mk_accessors('rw', @fields); } { no strict 'refs'; sub _mk_accessors { my($self, $access, @fields) = @_; my $class = ref $self || $self; my $ra = $access eq 'rw' || $access eq 'ro'; my $wa = $access eq 'rw' || $access eq 'wo'; foreach my $field (@fields) { my $accessor_name = $self->accessor_name_for($field); my $mutator_name = $self->mutator_name_for($field); if( $accessor_name eq 'DESTROY' or $mutator_name eq 'DESTROY' ) { $self->_carp("Having a data accessor named DESTROY in '$class' is unwise."); } if ($accessor_name eq $mutator_name) { my $accessor; if ($ra && $wa) { $accessor = $self->make_accessor($field); } elsif ($ra) { $accessor = $self->make_ro_accessor($field); } else { $accessor = $self->make_wo_accessor($field); } unless (defined &{"${class}::$accessor_name"}) { *{"${class}::$accessor_name"} = $accessor; } if ($accessor_name eq $field) { # the old behaviour my $alias = "_${field}_accessor"; *{"${class}::$alias"} = $accessor unless defined &{"${class}::$alias"}; } } else { if ($ra and not defined &{"${class}::$accessor_name"}) { *{"${class}::$accessor_name"} = $self->make_ro_accessor($field); } if ($wa and not defined &{"${class}::$mutator_name"}) { *{"${class}::$mutator_name"} = $self->make_wo_accessor($field); } } } }