


fields(3p)       Perl Programmers Reference Guide      fields(3p)


NAME
       fields - compile-time class fields

SYNOPSIS
           {
               package Foo;
               use fields qw(foo bar _private);
           }
           ...
           my Foo $var = new Foo;
           $var->{foo} = 42;

           # This will generate a compile-time error.
           $var->{zap} = 42;

           {
               package Bar;
               use base 'Foo';
               use fields 'bar';             # hides Foo->{bar}
               use fields qw(baz _private);  # not shared with Foo
           }


DESCRIPTION
       The fields pragma enables compile-time verified class
       fields.  It does so by updating the %FIELDS hash in the
       calling package.

       If a typed lexical variable holding a reference is used to
       access a hash element and the %FIELDS hash of the given
       type exists, then the operation is turned into an array
       access at compile time.  The %FIELDS hash maps from hash
       element names to the array indices.  If the hash element
       is not present in the %FIELDS hash, then a compile-time
       error is signaled.

       Since the %FIELDS hash is used at compile-time, it must be
       set up at compile-time too.  This is made easier with the
       help of the 'fields' and the 'base' pragma modules.  The
       'base' pragma will copy fields from base classes and the
       'fields' pragma adds new fields.  Field names that start
       with an underscore character are made private to a class
       and are not visible to subclasses.  Inherited fields can
       be overridden but will generate a warning if used together
       with the -w switch.

       The effect of all this is that you can have objects with
       named fields which are as compact and as fast arrays to
       access.  This only works as long as the objects are
       accessed through properly typed variables.  For untyped
       access to work you have to make sure that a reference to
       the proper %FIELDS hash is assigned to the 0'th element of
       the array object (so that the objects can be treated like
       an pseudo-hash).  A constructor like this does the job:



29/Apr/1999            perl 5.005, patch 03                     1





fields(3p)       Perl Programmers Reference Guide      fields(3p)


         sub new
         {
             my $class = shift;
             no strict 'refs';
             my $self = bless [\%{"$class\::FIELDS"}], $class;
             $self;
         }


SEE ALSO
       the base manpage, the section on Pseudo-hashes: Using an
       array as a hash in the perlref manpage













































29/Apr/1999            perl 5.005, patch 03                     2


