*nix Documentation Project
·  Home
 +   man pages
·  Linux HOWTOs
·  FreeBSD Tips
·  *niX Forums

  man pages->IRIX man pages -> perl5/Class::Struct (3)              
Title
Content
Arch
Section
 

count(5)

Contents


Class::Struct(3)					      Class::Struct(3)


NAME    [Toc]    [Back]

     Class::Struct - declare struct-like datatypes as Perl classes

SYNOPSIS    [Toc]    [Back]

	 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, ... );

	 package Myobj;
	 use Class::Struct;
		 # declare struct with four types of elements:
	 struct( s => '$', a =>	'@', h => '%', c => 'My_Other_Class' );

	 $obj =	new Myobj;		 # constructor

					 # scalar type accessor:
	 $element_value	= $obj->s;	     # element value
	 $obj->s('new value');		     # assign to element

					 # array type accessor:
	 $ary_ref = $obj->a;		     # reference to whole array
	 $ary_element_value = $obj->a(2);    # array element value
	 $obj->a(2, 'new value');	     # assign to array element

					 # hash	type accessor:
	 $hash_ref = $obj->h;		     # reference to whole hash
	 $hash_element_value = $obj->h('x'); # hash element value
	 $obj->h('x', 'new value');	   # assign to hash element

					 # class type accessor:
	 $element_value	= $obj->c;	     # object reference
	 $obj->c->method(...);		     # call method of object
	 $obj->c(new My_Other_Class);	     # assign a	new object

DESCRIPTION    [Toc]    [Back]

     Class::Struct exports a single function, struct.  Given a list of element
     names and types, and optionally a class name, struct creates a Perl 5
     class that	implements a "struct-like" data	structure.

     The new class is given a constructor method, new, for creating struct
     objects.






									Page 1






Class::Struct(3)					      Class::Struct(3)



     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 sub of the same name in the package.	(See
     Example 2.)

     Each element's type can be	scalar,	array, hash, or	class.

     The struct() function

     The struct	function has three forms of parameter-list.

	 struct( CLASS_NAME => [ ELEMENT_LIST ]);
	 struct( CLASS_NAME => { ELEMENT_LIST });
	 struct( ELEMENT_LIST );

     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.

     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.

     The class created by struct must not be a subclass	of another class other
     than UNIVERSAL.

     A function	named new must not be explicitly defined in a class created by
     struct.

     The ELEMENT_LIST has the form

	 NAME => TYPE, ...

     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 (-w) is set.

     Element Types and Accessor	Methods

     The four element types -- scalar, array, hash, and	class -- are
     represented by strings -- '$', '@', '%', and a class name -- optionally
     preceded by a '*'.

     The accessor method provided by struct for	an element depends on the
     declared type of the element.

     Scalar ('$' or '*$')
	  The element is a scalar, and is initialized to undef.

	  The accessor's argument, if any, is assigned to the element.



									Page 2






Class::Struct(3)					      Class::Struct(3)



	  If the element type is '$', the value	of the element (after
	  assignment) is returned. If the element type is '*$',	a reference to
	  the element is returned.

     Array ('@'	or '*@')
	  The element is an array, initialized to ().

	  With no argument, the	accessor returns a reference to	the element's
	  whole	array.

	  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 '@', the
	  accessor returns the array element value.  If	the element type is
	  '*@',	a reference to the array element is returned.

     Hash ('%' or '*%')
	  The element is a hash, initialized to	().

	  With no argument, the	accessor returns a reference to	the element's
	  whole	hash.

	  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	'%', the
	  accessor returns the hash element value.  If the element type	is
	  '*%',	a reference to the hash	element	is returned.

     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 initialized to the
	  result of calling the	new constructor	of the named class.

	  The accessor's argument, if any, is assigned to the element. The
	  accessor will	croak if this is not an	appropriate object reference.

	  If the element type does not start with a '*', the accessor returns
	  the element value (after assignment).	If the element type starts
	  with a '*', a	reference to the element itself	is returned.

EXAMPLES    [Toc]    [Back]

     Example 1
	  Giving a struct element a class type that is also a struct is	how
	  structs are nested.  Here, timeval represents	a time (seconds	and
	  microseconds), and rusage has	two elements, each of which is of type
	  timeval.

	      use Class::Struct;







									Page 3






Class::Struct(3)					      Class::Struct(3)



	      struct( rusage =>	{
		  ru_utime => timeval,	# seconds
		  ru_stime => timeval,	# microseconds
	      });

	      struct( timeval => [
		  tv_secs  => '$',
		  tv_usecs => '$',
	      ]);

		  # create an object:
	      my $t = new rusage;
		  # $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);


     Example 2
	  An accessor function can be redefined	in order to provide additional
	  checking of values, etc.  Here, we want the count element always to
	  be nonnegative, so we	redefine the count accessor accordingly.

	      package MyObj;
	      use Class::Struct;

			  # declare the	struct
	      struct ( 'MyObj',	{ count	=> '$',	stuff => '%' } );

			  # override the default accessor method for 'count'
	      sub count	{
		  my $self = shift;
		  if ( @_ ) {
		      die 'count must be nonnegative' if $_[0] < 0;
		      $self->{'count'} = shift;
		      warn "Too	many args to count" if @_;
		  }
		  return $self->{'count'};
	      }

	      package main;
	      $x = new MyObj;
	      print "\$x->
, "\n";
				      #	prints '$x->count(5) = 5'

	      print "\$x->count	= ", $x->count,	"\n";
				      #	prints '$x->count = 5'





									Page 4






Class::Struct(3)					      Class::Struct(3)



	      print "\$x->count(-5) = ", $x->count(-5),	"\n";
				      #	dies due to negative argument!


Author and Modification	History
     Renamed to	Class::Struct and modified by Jim Miner, 1997-04-02.

	 members() function removed.
	 Documentation corrected and extended.
	 Use of	struct() in a subclass prohibited.
	 User definition of accessor allowed.
	 Treatment of '*' in element types corrected.
	 Treatment of classes as element types corrected.
	 Class name to struct()	made optional.
	 Diagnostic checks added.

     Originally	Class::Template	by Dean	Roehrich.

	 # 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's "structs.pl"
	 # idea.


















									Page 5






Class::Struct(3)					      Class::Struct(3)


									PPPPaaaaggggeeee 6666
[ Back ]
 Similar pages
Name OS Title
constant IRIX Perl pragma to declare constants
acl_from_text IRIX convert a POSIX ACL string to a struct acl or a struct acl to a POSIX ACL string
perljp OpenBSD AEuEU,i Perl Y~YxYE `A^a`I`A Perl xIAx3|xOxex|x3x1/2! Perl 5.8.0 xexeicUni- _ codeYuYYi1/4YEx~AcEyxE...
tt_feature_required HP-UX declare a feature to be required by the calling program.
tt_message_accept HP-UX declare that the process has been initialized and can accept messages
uio OpenBSD move data described by a struct uio
uiomove OpenBSD move data described by a struct uio
uiomove NetBSD move data described by a struct uio
pw_dup OpenBSD make a copy of a struct passwd
realhostname_sa FreeBSD convert a struct sockaddr to the real host name
Copyright © 2004-2005 DeniX Solutions SRL
newsletter delivery service