package Dabreegster::Attribute::Maker; use strict; use warnings; # if $] >= 5.6.0; sub import { shift; my $pkg = caller; foreach my $attr ( @_ ) { # We're doing symbol-table manipulation here, so # the prohibition against soft references needs to # be relaxed, but only within this context. no strict 'refs'; my $getter = "${pkg}::${attr}"; my $setter = "${pkg}::set_${attr}"; # We will only define the function if the function # hasn't already been defined. *{ $getter } = sub { my $self = shift; if ( (Scalar::Util::reftype( $self->{$attr} ) || '') eq 'CODE' ) { return $self->{$attr}->( @_ ); } else { return $self->{$attr}; } } unless defined \&{ $getter }; *{ $setter } = sub { my $self = shift; if ( @_ ) { $self->{$attr} = shift; } return $self; } unless defined \&{ $setter }; } return; } 1; __END__