Commit | Line | Data |
458fb581 |
1 | package fields; |
2 | |
d516a115 |
3 | =head1 NAME |
4 | |
5 | fields - compile-time class fields |
6 | |
7 | =head1 SYNOPSIS |
8 | |
9 | { |
10 | package Foo; |
11 | use fields qw(foo bar baz); |
12 | } |
13 | ... |
14 | my Foo $var = new Foo; |
15 | $var->{foo} = 42; |
16 | |
17 | # This will generate a compile-time error. |
18 | $var->{zap} = 42; |
19 | |
20 | =head1 DESCRIPTION |
21 | |
22 | The C<fields> pragma enables compile-time verified class fields. |
23 | |
24 | =cut |
25 | |
458fb581 |
26 | sub import { |
27 | my $class = shift; |
28 | my ($package) = caller; |
29 | my $fields = \%{"$package\::FIELDS"}; |
30 | my $i = $fields->{__MAX__}; |
31 | foreach my $f (@_) { |
32 | if (defined($fields->{$f})) { |
33 | require Carp; |
34 | Carp::croak("Field name $f already in use"); |
35 | } |
36 | $fields->{$f} = ++$i; |
37 | } |
38 | $fields->{__MAX__} = $i; |
39 | } |
40 | |
41 | 1; |