manual integration of all outstanding ansi branch stuff into mainline
[p5sagit/p5-mst-13.2.git] / lib / fields.pm
1 package fields;
2
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
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;