File: ro.pm

package info (click to toggle)
libaccessors-perl 1.01-1
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd, wheezy
  • size: 164 kB
  • ctags: 36
  • sloc: perl: 330; makefile: 2
file content (107 lines) | stat: -rwxr-xr-x 2,248 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
=head1 NAME

accessors::ro - create 'classic' read-only accessor methods in caller's package.

=head1 SYNOPSIS

  package Foo;
  use accessors::ro qw( foo bar baz );

  my $obj = bless { foo => 'read only? ' }, 'Foo';

  # values are read-only, so set is disabled:
  print "oh my!\n" if $obj->foo( "set?" ) eq 'read only? ';

  # if you really need to change the vars,
  # you must use direct-variable-access:
  $obj->{bar} = 'i need a drink ';
  $obj->{baz} = 'now';

  # always returns the current value:
  print $obj->foo, $obj->bar, $obj->baz, "!\n";

=cut

package accessors::ro;

use strict;
use warnings::register;
use base qw( accessors );

our $VERSION  = '1.01';
our $REVISION = (split(/ /, ' $Revision: 1.4 $ '))[2];

use constant style => 'ro';

sub create_accessor {
    my ($class, $accessor, $property) = @_;
    # get is slightly faster if we eval instead of using a closure + anon
    # sub, but the difference is marginal (~5%), and this uses less memory...
    no strict 'refs';
    *{$accessor} = sub { return $_[0]->{$property} };
}

1;

__END__

=head1 DESCRIPTION

The B<accessors::ro> pragma lets you create simple I<classic> read-only
accessors at compile-time.

The generated methods look like this:

  sub foo {
      my $self = shift;
      return $self->{foo};
  }

They I<always> return the current value, just like L<accessors::ro>.

=head1 PERFORMANCE

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

=over 4

=item *

typically I<5-15% faster> than hard-coded accessors (like the above example).

=item *

typically I<0-15% slower> than I<optimized> accessors (less readable).

=item *

typically a I<small> performance hit at startup (accessors are created at
compile-time).

=item *

uses the same anonymous sub to reduce memory consumption (sometimes by 80%).

=back

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

=head1 CAVEATS

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

=head1 AUTHOR

Steve Purkis <spurkis@cpan.org>

=head1 SEE ALSO

L<accessors>,
L<accessors::rw>,
L<accessors::classic>,
L<accessors::chained>,
L<base>

=cut