accessors - create accessor methods in caller's package.


NAME

accessors - create accessor methods in caller's package.

Back to Top


SYNOPSIS

  package Foo;
  use accessors qw( foo bar baz );
  my $obj = bless {}, 'Foo';
  # generates chaining accessors
  # that you can set like this:
  $obj->foo( 'hello ' )
      ->bar( 'world' )
      ->baz( "!\n" );
  # you get the values by passing no params:
  print $obj->foo, $obj->bar, $obj->baz;

Back to Top


DESCRIPTION

The accessors pragma lets you create simple accessors at compile-time.

This saves you from writing them by hand, which tends to result in cut-n-paste errors and a mess of duplicated code. It can also help you reduce the ammount of unwanted direct-variable access that may creep into your codebase when you're feeling lazy. accessors was designed with laziness in mind.

Method-chaining accessors are generated by default. Note that you can still use the accessors::chained manpage directly for reasons of backwards compatability.

See the accessors::classic manpage for accessors that always return the current value if you don't like method chaining.

Back to Top


GENERATED METHODS

accessors will generate methods that return the current object on set:

  sub foo {
      my $self = shift;
      if (@_) { $self->{-foo} = shift; return $self; }
      else    { return $self->{-foo}; }
  }

This way they can be chained together.

Why prepend the dash?

The dash (-) is prepended to the property name for a few reasons:

You shouldn't care too much about how the property is stored anyway - if you do, you're likely trying to do something special (and should really consider writing the accessors out long hand), or it's simply a matter of preference in which case you can use the accessors::classic manpage, or sub-class this module.

Back to Top


PERFORMANCE

There is little-to-no performace hit when using generated accessors; in fact there is usually a performance gain.

See the benchmark tests included with this distribution for more details.

Back to Top


MOTIVATION

The main difference between the accessors pragma and other accessor generators is simplicity.

Back to Top


SUB-CLASSING

If you prefer a different style of accessor or you need to do something more complicated, there's nothing to stop you from sub-classing. It should be pretty easy. Look through the accessors::classic manpage, the accessors::ro manpage, and the accessors::rw manpage to see how it's done.

Back to Top


CAVEATS

Classes using blessed scalarrefs, arrayrefs, etc. are not supported for sake of simplicity. Only hashrefs are supported.

Back to Top


THANKS

Thanks to Michael G. Schwern for indirectly inspiring this module, and for his feedback & suggestions.

Also to Paul Makepeace and David Wright for showing me faster accessors, to chocolateboy for his contributions, the CPAN Testers for their bug reports, and to James Duncan and people on London.pm for their feedback.

Back to Top


AUTHOR

Steve Purkis <spurkis@cpan.org>

Back to Top


SEE ALSO

the accessors::classic manpage, the accessors::chained manpage

Similar and related modules:

base, fields, the Class::Accessor manpage, the Class::Struct manpage, the Class::Methodmaker manpage, the Class::Generate manpage, the Class::Class manpage, the Class::Tangram manpage, the Object::Tiny manpage

Back to Top

 accessors - create accessor methods in caller's package.