summaryrefslogtreecommitdiffstats
path: root/upstream/debian-unstable/man3/Class::Struct.3perl
diff options
context:
space:
mode:
Diffstat (limited to 'upstream/debian-unstable/man3/Class::Struct.3perl')
-rw-r--r--upstream/debian-unstable/man3/Class::Struct.3perl455
1 files changed, 455 insertions, 0 deletions
diff --git a/upstream/debian-unstable/man3/Class::Struct.3perl b/upstream/debian-unstable/man3/Class::Struct.3perl
new file mode 100644
index 00000000..b0a1401d
--- /dev/null
+++ b/upstream/debian-unstable/man3/Class::Struct.3perl
@@ -0,0 +1,455 @@
+.\" -*- mode: troff; coding: utf-8 -*-
+.\" Automatically generated by Pod::Man 5.01 (Pod::Simple 3.43)
+.\"
+.\" Standard preamble:
+.\" ========================================================================
+.de Sp \" Vertical space (when we can't use .PP)
+.if t .sp .5v
+.if n .sp
+..
+.de Vb \" Begin verbatim text
+.ft CW
+.nf
+.ne \\$1
+..
+.de Ve \" End verbatim text
+.ft R
+.fi
+..
+.\" \*(C` and \*(C' are quotes in nroff, nothing in troff, for use with C<>.
+.ie n \{\
+. ds C` ""
+. ds C' ""
+'br\}
+.el\{\
+. ds C`
+. ds C'
+'br\}
+.\"
+.\" Escape single quotes in literal strings from groff's Unicode transform.
+.ie \n(.g .ds Aq \(aq
+.el .ds Aq '
+.\"
+.\" If the F register is >0, we'll generate index entries on stderr for
+.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
+.\" entries marked with X<> in POD. Of course, you'll have to process the
+.\" output yourself in some meaningful fashion.
+.\"
+.\" Avoid warning from groff about undefined register 'F'.
+.de IX
+..
+.nr rF 0
+.if \n(.g .if rF .nr rF 1
+.if (\n(rF:(\n(.g==0)) \{\
+. if \nF \{\
+. de IX
+. tm Index:\\$1\t\\n%\t"\\$2"
+..
+. if !\nF==2 \{\
+. nr % 0
+. nr F 2
+. \}
+. \}
+.\}
+.rr rF
+.\" ========================================================================
+.\"
+.IX Title "Class::Struct 3perl"
+.TH Class::Struct 3perl 2024-01-12 "perl v5.38.2" "Perl Programmers Reference Guide"
+.\" For nroff, turn off justification. Always turn off hyphenation; it makes
+.\" way too many mistakes in technical documents.
+.if n .ad l
+.nh
+.SH NAME
+Class::Struct \- declare struct\-like datatypes as Perl classes
+.SH SYNOPSIS
+.IX Header "SYNOPSIS"
+.Vb 5
+\& use Class::Struct;
+\& # declare struct, based on array:
+\& struct( CLASS_NAME => [ ELEMENT_NAME => ELEMENT_TYPE, ... ]);
+\& # declare struct, based on hash:
+\& struct( CLASS_NAME => { ELEMENT_NAME => ELEMENT_TYPE, ... });
+\&
+\& package CLASS_NAME;
+\& use Class::Struct;
+\& # declare struct, based on array, implicit class name:
+\& struct( ELEMENT_NAME => ELEMENT_TYPE, ... );
+\&
+\& # Declare struct at compile time
+\& use Class::Struct CLASS_NAME => [ELEMENT_NAME => ELEMENT_TYPE, ...];
+\& use Class::Struct CLASS_NAME => {ELEMENT_NAME => ELEMENT_TYPE, ...};
+\&
+\& # declare struct at compile time, based on array, implicit
+\& # class name:
+\& package CLASS_NAME;
+\& use Class::Struct ELEMENT_NAME => ELEMENT_TYPE, ... ;
+\&
+\& package Myobj;
+\& use Class::Struct;
+\& # declare struct with four types of elements:
+\& struct( s => \*(Aq$\*(Aq, a => \*(Aq@\*(Aq, h => \*(Aq%\*(Aq, c => \*(AqMy_Other_Class\*(Aq );
+\&
+\& my $obj = Myobj\->new; # constructor
+\&
+\& # scalar type accessor:
+\& my $element_value = $obj\->s; # element value
+\& $obj\->s(\*(Aqnew value\*(Aq); # assign to element
+\&
+\& # array type accessor:
+\& my $ary_ref = $obj\->a; # reference to whole array
+\& my $ary_element_value = $obj\->a(2); # array element value
+\& $obj\->a(2, \*(Aqnew value\*(Aq); # assign to array element
+\&
+\& # hash type accessor:
+\& my $hash_ref = $obj\->h; # reference to whole hash
+\& my $hash_element_value = $obj\->h(\*(Aqx\*(Aq); # hash element value
+\& $obj\->h(\*(Aqx\*(Aq, \*(Aqnew value\*(Aq); # assign to hash element
+\&
+\& # class type accessor:
+\& my $element_value = $obj\->c; # object reference
+\& $obj\->c\->method(...); # call method of object
+\& $obj\->c(new My_Other_Class); # assign a new object
+.Ve
+.SH DESCRIPTION
+.IX Header "DESCRIPTION"
+\&\f(CW\*(C`Class::Struct\*(C'\fR exports a single function, \f(CW\*(C`struct\*(C'\fR.
+Given a list of element names and types, and optionally
+a class name, \f(CW\*(C`struct\*(C'\fR creates a Perl 5 class that implements
+a "struct-like" data structure.
+.PP
+The new class is given a constructor method, \f(CW\*(C`new\*(C'\fR, for creating
+struct objects.
+.PP
+Each element in the struct data has an accessor method, which is
+used to assign to the element and to fetch its value. The
+default accessor can be overridden by declaring a \f(CW\*(C`sub\*(C'\fR of the
+same name in the package. (See Example 2.)
+.PP
+Each element's type can be scalar, array, hash, or class.
+.ie n .SS "The struct() function"
+.el .SS "The \f(CWstruct()\fP function"
+.IX Subsection "The struct() function"
+The \f(CW\*(C`struct\*(C'\fR function has three forms of parameter-list.
+.PP
+.Vb 3
+\& struct( CLASS_NAME => [ ELEMENT_LIST ]);
+\& struct( CLASS_NAME => { ELEMENT_LIST });
+\& struct( ELEMENT_LIST );
+.Ve
+.PP
+The first and second forms explicitly identify the name of the
+class being created. The third form assumes the current package
+name as the class name.
+.PP
+An object of a class created by the first and third forms is
+based on an array, whereas an object of a class created by the
+second form is based on a hash. The array-based forms will be
+somewhat faster and smaller; the hash-based forms are more
+flexible.
+.PP
+The class created by \f(CW\*(C`struct\*(C'\fR must not be a subclass of another
+class other than \f(CW\*(C`UNIVERSAL\*(C'\fR.
+.PP
+It can, however, be used as a superclass for other classes. To facilitate
+this, the generated constructor method uses a two-argument blessing.
+Furthermore, if the class is hash-based, the key of each element is
+prefixed with the class name (see \fIPerl Cookbook\fR, Recipe 13.12).
+.PP
+A function named \f(CW\*(C`new\*(C'\fR must not be explicitly defined in a class
+created by \f(CW\*(C`struct\*(C'\fR.
+.PP
+The \fIELEMENT_LIST\fR has the form
+.PP
+.Vb 1
+\& NAME => TYPE, ...
+.Ve
+.PP
+Each name-type pair declares one element of the struct. Each
+element name will be defined as an accessor method unless a
+method by that name is explicitly defined; in the latter case, a
+warning is issued if the warning flag (\fB\-w\fR) is set.
+.SS "Class Creation at Compile Time"
+.IX Subsection "Class Creation at Compile Time"
+\&\f(CW\*(C`Class::Struct\*(C'\fR can create your class at compile time. The main reason
+for doing this is obvious, so your class acts like every other class in
+Perl. Creating your class at compile time will make the order of events
+similar to using any other class ( or Perl module ).
+.PP
+There is no significant speed gain between compile time and run time
+class creation, there is just a new, more standard order of events.
+.SS "Element Types and Accessor Methods"
+.IX Subsection "Element Types and Accessor Methods"
+The four element types \-\- scalar, array, hash, and class \-\- are
+represented by strings \-\- \f(CW\*(Aq$\*(Aq\fR, \f(CW\*(Aq@\*(Aq\fR, \f(CW\*(Aq%\*(Aq\fR, and a class name \-\-
+optionally preceded by a \f(CW\*(Aq*\*(Aq\fR.
+.PP
+The accessor method provided by \f(CW\*(C`struct\*(C'\fR for an element depends
+on the declared type of the element.
+.ie n .IP "Scalar (\*(Aq$\*(Aq or \*(Aq*$\*(Aq)" 4
+.el .IP "Scalar (\f(CW\*(Aq$\*(Aq\fR or \f(CW\*(Aq*$\*(Aq\fR)" 4
+.IX Item "Scalar ($ or *$)"
+The element is a scalar, and by default is initialized to \f(CW\*(C`undef\*(C'\fR
+(but see "Initializing with new").
+.Sp
+The accessor's argument, if any, is assigned to the element.
+.Sp
+If the element type is \f(CW\*(Aq$\*(Aq\fR, the value of the element (after
+assignment) is returned. If the element type is \f(CW\*(Aq*$\*(Aq\fR, a reference
+to the element is returned.
+.ie n .IP "Array (\*(Aq@\*(Aq or \*(Aq*@\*(Aq)" 4
+.el .IP "Array (\f(CW\*(Aq@\*(Aq\fR or \f(CW\*(Aq*@\*(Aq\fR)" 4
+.IX Item "Array (@ or *@)"
+The element is an array, initialized by default to \f(CW\*(C`()\*(C'\fR.
+.Sp
+With no argument, the accessor returns a reference to the
+element's whole array (whether or not the element was
+specified as \f(CW\*(Aq@\*(Aq\fR or \f(CW\*(Aq*@\*(Aq\fR).
+.Sp
+With one or two arguments, the first argument is an index
+specifying one element of the array; the second argument, if
+present, is assigned to the array element. If the element type
+is \f(CW\*(Aq@\*(Aq\fR, the accessor returns the array element value. If the
+element type is \f(CW\*(Aq*@\*(Aq\fR, a reference to the array element is
+returned.
+.Sp
+As a special case, when the accessor is called with an array reference
+as the sole argument, this causes an assignment of the whole array element.
+The object reference is returned.
+.ie n .IP "Hash (\*(Aq%\*(Aq or \*(Aq*%\*(Aq)" 4
+.el .IP "Hash (\f(CW\*(Aq%\*(Aq\fR or \f(CW\*(Aq*%\*(Aq\fR)" 4
+.IX Item "Hash (% or *%)"
+The element is a hash, initialized by default to \f(CW\*(C`()\*(C'\fR.
+.Sp
+With no argument, the accessor returns a reference to the
+element's whole hash (whether or not the element was
+specified as \f(CW\*(Aq%\*(Aq\fR or \f(CW\*(Aq*%\*(Aq\fR).
+.Sp
+With one or two arguments, the first argument is a key specifying
+one element of the hash; the second argument, if present, is
+assigned to the hash element. If the element type is \f(CW\*(Aq%\*(Aq\fR, the
+accessor returns the hash element value. If the element type is
+\&\f(CW\*(Aq*%\*(Aq\fR, a reference to the hash element is returned.
+.Sp
+As a special case, when the accessor is called with a hash reference
+as the sole argument, this causes an assignment of the whole hash element.
+The object reference is returned.
+.ie n .IP "Class (\*(AqClass_Name\*(Aq or \*(Aq*Class_Name\*(Aq)" 4
+.el .IP "Class (\f(CW\*(AqClass_Name\*(Aq\fR or \f(CW\*(Aq*Class_Name\*(Aq\fR)" 4
+.IX Item "Class (Class_Name or *Class_Name)"
+The element's value must be a reference blessed to the named
+class or to one of its subclasses. The element is not initialized
+by default.
+.Sp
+The accessor's argument, if any, is assigned to the element. The
+accessor will \f(CW\*(C`croak\*(C'\fR if this is not an appropriate object
+reference.
+.Sp
+If the element type does not start with a \f(CW\*(Aq*\*(Aq\fR, the accessor
+returns the element value (after assignment). If the element type
+starts with a \f(CW\*(Aq*\*(Aq\fR, a reference to the element itself is returned.
+.ie n .SS "Initializing with ""new"""
+.el .SS "Initializing with \f(CWnew\fP"
+.IX Subsection "Initializing with new"
+\&\f(CW\*(C`struct\*(C'\fR always creates a constructor called \f(CW\*(C`new\*(C'\fR. That constructor
+may take a list of initializers for the various elements of the new
+struct.
+.PP
+Each initializer is a pair of values: \fIelement name\fR\f(CW\*(C` => \*(C'\fR\fIvalue\fR.
+The initializer value for a scalar element is just a scalar value. The
+initializer for an array element is an array reference. The initializer
+for a hash is a hash reference.
+.PP
+The initializer for a class element is an object of the corresponding class,
+or of one of it's subclasses, or a reference to a hash containing named
+arguments to be passed to the element's constructor.
+.PP
+See Example 3 below for an example of initialization.
+.SH EXAMPLES
+.IX Header "EXAMPLES"
+.IP "Example 1" 4
+.IX Item "Example 1"
+Giving a struct element a class type that is also a struct is how
+structs are nested. Here, \f(CW\*(C`Timeval\*(C'\fR represents a time (seconds and
+microseconds), and \f(CW\*(C`Rusage\*(C'\fR has two elements, each of which is of
+type \f(CW\*(C`Timeval\*(C'\fR.
+.Sp
+.Vb 1
+\& use Class::Struct;
+\&
+\& struct( Rusage => {
+\& ru_utime => \*(AqTimeval\*(Aq, # user time used
+\& ru_stime => \*(AqTimeval\*(Aq, # system time used
+\& });
+\&
+\& struct( Timeval => [
+\& tv_secs => \*(Aq$\*(Aq, # seconds
+\& tv_usecs => \*(Aq$\*(Aq, # microseconds
+\& ]);
+\&
+\& # create an object:
+\& my $t = Rusage\->new(ru_utime=>Timeval\->new(),
+\& ru_stime=>Timeval\->new());
+\&
+\& # $t\->ru_utime and $t\->ru_stime are objects of type Timeval.
+\& # set $t\->ru_utime to 100.0 sec and $t\->ru_stime to 5.0 sec.
+\& $t\->ru_utime\->tv_secs(100);
+\& $t\->ru_utime\->tv_usecs(0);
+\& $t\->ru_stime\->tv_secs(5);
+\& $t\->ru_stime\->tv_usecs(0);
+.Ve
+.IP "Example 2" 4
+.IX Item "Example 2"
+An accessor function can be redefined in order to provide
+additional checking of values, etc. Here, we want the \f(CW\*(C`count\*(C'\fR
+element always to be nonnegative, so we redefine the \f(CW\*(C`count\*(C'\fR
+accessor accordingly.
+.Sp
+.Vb 2
+\& package MyObj;
+\& use Class::Struct;
+\&
+\& # declare the struct
+\& struct ( \*(AqMyObj\*(Aq, { count => \*(Aq$\*(Aq, stuff => \*(Aq%\*(Aq } );
+\&
+\& # override the default accessor method for \*(Aqcount\*(Aq
+\& sub count {
+\& my $self = shift;
+\& if ( @_ ) {
+\& die \*(Aqcount must be nonnegative\*(Aq if $_[0] < 0;
+\& $self\->{\*(AqMyObj::count\*(Aq} = shift;
+\& warn "Too many args to count" if @_;
+\& }
+\& return $self\->{\*(AqMyObj::count\*(Aq};
+\& }
+\&
+\& package main;
+\& $x = new MyObj;
+\& print "\e$x\->count(5) = ", $x\->count(5), "\en";
+\& # prints \*(Aq$x\->count(5) = 5\*(Aq
+\&
+\& print "\e$x\->count = ", $x\->count, "\en";
+\& # prints \*(Aq$x\->count = 5\*(Aq
+\&
+\& print "\e$x\->count(\-5) = ", $x\->count(\-5), "\en";
+\& # dies due to negative argument!
+.Ve
+.IP "Example 3" 4
+.IX Item "Example 3"
+The constructor of a generated class can be passed a list
+of \fIelement\fR=>\fIvalue\fR pairs, with which to initialize the struct.
+If no initializer is specified for a particular element, its default
+initialization is performed instead. Initializers for non-existent
+elements are silently ignored.
+.Sp
+Note that the initializer for a nested class may be specified as
+an object of that class, or as a reference to a hash of initializers
+that are passed on to the nested struct's constructor.
+.Sp
+.Vb 1
+\& use Class::Struct;
+\&
+\& struct Breed =>
+\& {
+\& name => \*(Aq$\*(Aq,
+\& cross => \*(Aq$\*(Aq,
+\& };
+\&
+\& struct Cat =>
+\& [
+\& name => \*(Aq$\*(Aq,
+\& kittens => \*(Aq@\*(Aq,
+\& markings => \*(Aq%\*(Aq,
+\& breed => \*(AqBreed\*(Aq,
+\& ];
+\&
+\&
+\& my $cat = Cat\->new( name => \*(AqSocks\*(Aq,
+\& kittens => [\*(AqMonica\*(Aq, \*(AqKenneth\*(Aq],
+\& markings => { socks=>1, blaze=>"white" },
+\& breed => Breed\->new(name=>\*(Aqshort\-hair\*(Aq, cross=>1),
+\& or: breed => {name=>\*(Aqshort\-hair\*(Aq, cross=>1},
+\& );
+\&
+\& print "Once a cat called ", $cat\->name, "\en";
+\& print "(which was a ", $cat\->breed\->name, ")\en";
+\& print "had 2 kittens: ", join(\*(Aq and \*(Aq, @{$cat\->kittens}), "\en";
+.Ve
+.SH "Author and Modification History"
+.IX Header "Author and Modification History"
+Modified by Damian Conway, 2001\-09\-10, v0.62.
+.PP
+.Vb 11
+\& Modified implicit construction of nested objects.
+\& Now will also take an object ref instead of requiring a hash ref.
+\& Also default initializes nested object attributes to undef, rather
+\& than calling object constructor without args
+\& Original over\-helpfulness was fraught with problems:
+\& * the class\*(Aqs constructor might not be called \*(Aqnew\*(Aq
+\& * the class might not have a hash\-like\-arguments constructor
+\& * the class might not have a no\-argument constructor
+\& * "recursive" data structures didn\*(Aqt work well:
+\& package Person;
+\& struct { mother => \*(AqPerson\*(Aq, father => \*(AqPerson\*(Aq};
+.Ve
+.PP
+Modified by Casey West, 2000\-11\-08, v0.59.
+.PP
+.Vb 1
+\& Added the ability for compile time class creation.
+.Ve
+.PP
+Modified by Damian Conway, 1999\-03\-05, v0.58.
+.PP
+.Vb 1
+\& Added handling of hash\-like arg list to class ctor.
+\&
+\& Changed to two\-argument blessing in ctor to support
+\& derivation from created classes.
+\&
+\& Added classname prefixes to keys in hash\-based classes
+\& (refer to "Perl Cookbook", Recipe 13.12 for rationale).
+\&
+\& Corrected behaviour of accessors for \*(Aq*@\*(Aq and \*(Aq*%\*(Aq struct
+\& elements. Package now implements documented behaviour when
+\& returning a reference to an entire hash or array element.
+\& Previously these were returned as a reference to a reference
+\& to the element.
+.Ve
+.PP
+Renamed to \f(CW\*(C`Class::Struct\*(C'\fR and modified by Jim Miner, 1997\-04\-02.
+.PP
+.Vb 8
+\& members() function removed.
+\& Documentation corrected and extended.
+\& Use of struct() in a subclass prohibited.
+\& User definition of accessor allowed.
+\& Treatment of \*(Aq*\*(Aq in element types corrected.
+\& Treatment of classes as element types corrected.
+\& Class name to struct() made optional.
+\& Diagnostic checks added.
+.Ve
+.PP
+Originally \f(CW\*(C`Class::Template\*(C'\fR by Dean Roehrich.
+.PP
+.Vb 10
+\& # Template.pm \-\-\- struct/member template builder
+\& # 12mar95
+\& # Dean Roehrich
+\& #
+\& # changes/bugs fixed since 28nov94 version:
+\& # \- podified
+\& # changes/bugs fixed since 21nov94 version:
+\& # \- Fixed examples.
+\& # changes/bugs fixed since 02sep94 version:
+\& # \- Moved to Class::Template.
+\& # changes/bugs fixed since 20feb94 version:
+\& # \- Updated to be a more proper module.
+\& # \- Added "use strict".
+\& # \- Bug in build_methods, was using @var when @$var needed.
+\& # \- Now using my() rather than local().
+\& #
+\& # Uses perl5 classes to create nested data types.
+\& # This is offered as one implementation of Tom Christiansen\*(Aqs
+\& # "structs.pl" idea.
+.Ve