in reply to Re^4: Modules for autogenerating accessor/mutator methods
in thread Modules for autogenerating accessor/mutator methods

You're using a sledgehammer to swat fleas.

Typeglob a bunch of closures. Save AUTOLOAD for a problem that needs the power. Here is an untested version.

package Whatever::Makes::Sense; sub create_accessors { my $class = caller(); foreach my $accessor (@_) { no strict 'refs'; *{"$class\::$accessor"} = sub { my $self = shift; $self->{$accessor} = shift if @_; return $self->{$accessor}; }; } } # And elsewhere... Whatever::Makes::Sense::create_accessors(qw(foo bar baz));
Drawbacks? You have to write the line of code that lists the accessors. Advantages? You leave AUTOLOAD free to do something else, you don't get things that you didn't intend to AUTOLOAD being AUTOLOADed, your methods are visible to UNIVERSAL::can, missing methods don't get accidentally interpreted as accessors (a good AUTOLOAD can address this, but requires more code)...

Replies are listed 'Best First'.
Re^6: Modules for autogenerating accessor/mutator methods
by tlm (Prior) on Jun 05, 2005 at 00:29 UTC

    As I already made clear, I use AUTOLOAD for very simple modules. In fact, I have never needed AUTOLOAD for anything else, so I have not attained the point of wanting to "save it". (What can I say? I'm a lowly script writer, not a heavy-hitting module meister.) I'm aware of the technique you describe, though I am sorry to say that I use it with AUTOLOAD:

    sub AUTOLOAD { my $self = $_[ 0 ]; ( my $name = our $AUTOLOAD ) =~ s/.*:://; return if $name eq 'DESTROTY'; die "Unknown field: $name" unless exists $self->{ $name }; no strict 'refs'; *$AUTOLOAD = sub { my $self = shift; return @_ ? $self->{ $name } = shift : $self->{ $name + }; }; goto &$AUTOLOAD; }
    (Yes, I posted a different version in another the reply, because I think it is more standard and easier to follow.)

    So, please tell me, what are the things one should be saving AUTOLOAD for instead of wasting it on accessors?

    Update: Bug in the original version fixed.

    the lowliest monk

      Off the top of my head, delegation.

        That's an instructive example. I now see tilly's point much more clearly. Thanks.

        And in light of this, I think it is somewhat unfortunate that in the Perl literature accessor generation is so often presented as a prime example of the utility of AUTOLOAD.

        the lowliest monk

Re^6: Modules for autogenerating accessor/mutator methods
by wazoox (Prior) on Jun 05, 2005 at 07:39 UTC
    At least I understand perfectly this one, while the AUTOLOAD stuff remains black magic to me :) Thank you so much, tilly!
      You're welcome. Your response illustrates yet another advantage of this technique - it is easier to figure out what is going on when you see it.