NAME

Liz::OCASet - Organization/Contact/Address module


DESCRIPTION

The Liz::OCASet package allows for very simple storage of sets of Organization, Contact and Address information. It can be used to create mailing lists (together with the Liz::BulkMail module) or to create databases of relations.

It can be used anywhere where you would want to keep more than just an email address and a name for a contact. But even then, the Liz::OCASet module might be a better choice because it will allow you to expand easily to more types of information should you need to do that.

The Liz::OCASet module contains three sub-modules:

 Liz::OCASet::Organization
 This module contains all information pertaining to organization.
 Each organization can have links to two addresses and one contact.

 Liz::OCASet::Contact
 This module contains all information pertaining to a contact person.
 Each contact can have links to two addresses and one organization.

 Liz::OCASet::Address
 This module contains all information about geographic locations
 such as street, zipcode, city, state and country.

The Liz::OCASet module internally uses the Liz::CategorySet module to store different types of information. This allows for a more compact storage of information such as cities, states, countries, gender, title, position and type of organization: these are all stored as a categoryID rather than as a string. All methods that are used by the developer however, hide this fact almost entirely from day-to-day usage.


Incorporate into Client Module

The Liz::OCASet module itself works best when incorporated into a client module because it moves the responsibility of aquiring a connection to a database to the client module and it allows any customisation to take place transparently to the developer.

Take for example the OCASet method of xxLINK.pm module:

 sub OCASet {

 # Obtain the parameters
 # Start the category using the $xxlink handle as the database handle
 # Return the finished object

 my( $xxlink,$token ) = @_;
 my( $ocaset ) = Liz::OCASet->new( $token,$xxlink );
 $ocaset;
 }

Because of the above code in xxLINK.pm, it is now possible to write the following code:

 $xxlink = new xxLINK;
 $ocaset = $xxlink->OCASet( 'customers' );

Note that the database connection of the category is hidden in the creation of the $xxlink object.


CLASS METHODS

The following methods can be called without an object specification, but as a class method such as Liz::OCASet->method().


ocasets

Return list of category identification names of all ocasets in the database specified. Usually not called by itself, but rather incorporated inside a Client Module.

Can also be used to determine whether a specific OCASet exists.

Input Parameters

 1 wildcard specification to match
   (default: undef = all)
 2 Liz::SQL compatible handle or reference to routine that performs connect
   (default: &Connect from caller's namespace)
Output Parameters

 1 reference to list of identification names in the current database
 2 reference to hash with full names
 3 reference to hash with database versions
Example

 $xxlink = new xxLINK;
 ($id,$name) = $xxlink->OCASets;
 $ocasets = @{$id};
 print "All $ocasets ocasets in Hospitality Net:\n";
 foreach( @{$id} ) {
   print " OCASet '$$name{$_}' ($_)\n";
 }

In xxLINK.pm:

 sub OCASets { Liz::OCASet->ocasets( $_[1],$_[0] ) }


ocasetexists

Returns whether a specific OCASet exists.

Input Parameters

 1 identification to check for
 2 Liz::SQL compatible handle or reference to routine that performs connect
   (default: &Connect from caller's namespace)
Output Parameters

 1 flag: whether OCASet exists
Example

 $xxlink = new xxLINK;
 if( $xxlink->OCASetExists( '' ) ) {
   print "OCASet with default identification name exists\n";
 }

In xxLINK.pm:

 sub OCASetExists { Liz::OCASet->ocasetexists( $_[1],$_[0] ) }


new

Create a new Liz::OCASet object. Creates connection or re-establishes connection with the MySQL database. Usually not called by itself, but rather incorporated inside a Client Module.

Input Parameters

 1 identification name of ocaset
   (default: default ocaset for database)
 2 Liz::SQL compatible handle or reference to routine that performs connect
   (default: &Connect from caller's namespace)
Output Parameters

 1 instantiated object
 2 flag: whether the OCASet was just created
Example

 $xxlink = new xxLINK;
 $oca = $xxlink->OCASet( 'customers' );

In xxLINK.pm:

 sub OCASet { Liz::OCASet->new( $_[1],$_[0] ) }


reset

Delete all tables of the OCASet object. Please use this with caution, as it will destroy any information that is stored for this OCASet. If called in a void context, no tables exist for this OCASet anymore, and any references in the NextID table are also removed. Otherwise, the tables will be re-created automatically and a new object will be returned, just as if the new method was called.

Output Parameters

 1 newly created OCASet object, current object will not work anymore
Example

 $ocaset->reset;
Example

 $ocaset = $ocaset->reset;


CONTENT METHODS

The following methods allow changes to information that is associated with an entire ocaset.


CategorySet

Return the CategorySet object that is associated with the OCASet. This can be used to add further categories to Organizations, Contacts and Addresses.

Output Parameters

 1 CategorySet object
Example

 $xxlink = new xxLINK;
 $ocaset = $xxlink->OCASet( 'eurest' );
 $categoryset = $ocaset->CategorySet;


Name

Specify or return the current name of the ocaset object. The name can be anything to further identify the goal of the ocaset.

Input Parameters

 1 new name of ocaset
   (default: no change)
Output Parameters

 1 current/old name of ocaset
Example

 $xxlink = new xxLINK;
 $ocaset = $xxlink->OCASet( 'eurest' );
 $ocaset->Name( 'Eurestjes' );


Authenticate

Specify or return the full name of the subroutine that is supposed to be used for authenticating users with this OCASet. This is usually the name as specified with the PerlAuthenHandler configuration parameter when using the Liz::Authenticate module for authentication.

Input Parameters

 1 new full name of the subroutine
   (default: no change)
Output Parameters

 1 current/old full name of the subroutine
Example

 $emailgids = new Emailgids;
 $ocaset = $emailgids->OCASet;
 $ocaset->Authenticate( 'Emailgids::MaintainAccess' );

 $subroutine = $ocaset->Authenticate;
 if( $subroutine ) {
   $access = Liz::Authenticate->new( $subroutine )
 }


LIST METHODS

The following methods return an SQL-statement(-like) handle that allows listing of (a selection of) the objects of a certain type.


Addresses

Return an SQL-statement(-like) handle that contains a selection of the Addresses available in the OCA set. The following field names can be specified with the first parameter:

 ID
 The ID of the Address.  Can be used as parameter on the L<Address>
 method.

 street
 The street of the Address, e.g. 'Eekholt 54'.

 zipcode
 The zipcode of the Address, e.g. '1112 XH'.

 cityID
 The ID of the City of the Address.  Can be changed to the appropriate
 string by using the L<IDs2Strings> method.

 stateID
 The ID of the State of the Address.  Can be changed to the appropriate
 string by using the L<IDs2Strings> method.

 countryID
 The ID of the Country of the Address.  Can be changed to the appropriate
 string by using the L<IDs2Strings> method.

 status
 The status of the Address: this can be any number between 0 and 255 inclusive.
 Status 255 usually means "automatic addition, should be reviewed".

 updated
 Timestamp when the Address record was last updated in the database.

 created
 Timestamp when the Address record was created in the database.

 options
 The Options associated with the Address.  Meaning of the options is
 entirely up to the implementation.

 data
 The extra Data associated with the Address.  Meaning of the data is
 entirely up to the implementation.

 IP
 Packed IP-number from where the record was last updated
Input Parameters

 1 fields to return for each Contact, seperated by comma's
   (default: 'ID,street,zipcode,cityID,stateID,countryID,status,updated,created,options,data,IP')
 2 extra SQL condition to apply
   (default: none)
 3 order in which to return the finds
   (default: zipcode)
 4 which records should be returned
   (default: all )
Output Parameters

 1 SQL-like statement handle (on which method "fetchrow" can be applied)
Examples

 $result = $ocaset->Addresses;
 $result = $ocaset->Addresses( 'street,zipcode,cityID',"street LIKE '%Eekho%" );


Contacts

Return an SQL-statement(-like) handle that contains a selection of the Contacts available in the OCA set. The following field names can be specified with the first parameter:

 ID
 The ID of the Contact.  Can be used as parameter on the L<Contact>
 method.

 email
 The email address of the Contact, e.g. 'wendy@xxLINK.nl'.

 name
 The name (either last name or complete name, depending on implementation)
 of the Contact, e.g. 'Dijk'.

 firstname
 The first name of the Contact, e.g. 'Wendy'.

 prefix
 The prefix of the last name of the Contact, e.g. 'van'.

 phone
 The phone number of the Contact.

 fax
 The fax number of the Contact.

 status
 The status of the Contact: this can be any number between 0 and 255 inclusive.
 Status 255 usually means "automatic addition, should be reviewed".

 updated
 Timestamp when the Contact record was last updated in the database.

 created
 Timestamp when the Contact record was created in the database.

 sortname
 The string on which the Contact can be sorted.  It usually consists of
 the name field, followed by the firstname and prefix field, all in
 lowercase and with all non-alphanumeric characters removed.

 addressID
 The ID of the Address information of the Contact.  If non-zero, can be
 used to create an L<Address> object with.

 organizationID
 The ID of the Organization information of the Contact.  If non-zero, can be
 used to create an L<Organization> object with.

 genderID
 The ID of the Gender of the Contact.  Can be changed to the appropriate
 string by using the L<IDs2Strings> method.

 titleID
 The ID of the Title of the Contact.  Can be changed to the appropriate
 string by using the L<IDs2Strings> method.

 positionID
 The ID of the Position of the Contact.  Can be changed to the appropriate
 string by using the L<IDs2Strings> method.

 options
 The Options associated with the Contact.  Meaning of the options is
 entirely up to the implementation.

 data
 The extra Data associated with the Contact.  Meaning of the data is
 entirely up to the implementation.

 IP
 Packed IP-number from where the record was last updated.

 url
 The URL associated with the contact.
Input Parameters

 1 fields to return for each Contact, seperated by comma's
   (default: 'ID,email,name,firstname,prefix,phone,fax,status,updated,created,sortname,addressID,organizationID,genderID,titleID,positionID,options,data,IP,url')
 2 extra SQL condition to apply
   (default: none)
 3 order in which to return the finds
   (default: sortname)
 4 which records should be returned
   (default: all )
Output Parameters

 1 SQL-like statement handle (on which method "fetchrow" can be applied)
Examples

 $result = $ocaset->Contacts;
 $result = $ocaset->Contacts( 'firstname,prefix,name,email','status=255' );


Organizations

Return an SQL-statement(-like) handle that contains a selection of the Organizations available in the OCA set. The following field names can be specified with the first parameter:

 ID
 The ID of the Organization.  Can be used as parameter on the L<Organization>
 method.

 email
 The email address of the Organization, e.g. 'info@xxLINK.nl'.

 name
 The name of the Organization, e.g. 'xxLINK Internet Services'.

 phone
 The phone number of the Organization.

 fax
 The fax number of the Organization.

 status
 The status of the Organization: this can be any number between 0 and 255
 inclusive.  Status 255 usually means "automatic addition, should be reviewed".

 updated
 Timestamp when the Organization record was last updated in the database.

 created
 Timestamp when the Organization record was created in the database.

 sortname
 The string on which the Organization can be sorted.  It usually consists of
 the name field in lowercase and with all non-alphanumeric characters removed.

 addressID
 The ID of the Address information of the Organization.  If non-zero, can be
 used to create an L<Address> object with.

 contactID
 The ID of the main Contact information of the Organization.  If non-zero,
 can be used to create a L<Contact> object with.

 typeID
 The ID of the Type of the Organization.  Can be changed to the appropriate
 string by using the L<IDs2Strings> method.

 options
 The Options associated with the Organization.  Meaning of the options is
 entirely up to the implementation.

 data
 The extra Data associated with the Organization.  Meaning of the data is
 entirely up to the implementation.

 department
 The Department associated with the Organization.

 IP
 Packed IP-number from where the record was last updated.

 url
 The URL associated with the organization.
Input Parameters

 1 fields to return for each Organization, seperated by comma's
   (default: 'ID,email,name,phone,fax,status,updated,created,sortname,addressID,contactID,typeID,options,data,department,IP,url')
 2 extra SQL condition to apply
   (default: none)
 3 order in which to return the finds
   (default: sortname)
 4 which records should be returned
   (default: all )
Output Parameters

 1 SQL-like statement handle (on which method "fetchrow" can be applied)
Examples

 $result = $ocaset->Organizations;
 $result = $ocaset->Organizations( 'name,email','status=255' );


OBJECT METHODS

The following methods allow creation of the various objects of the OCASet module.


Address

Create a new Liz::OCASet::Address object, either from existing information or for a new entry. For more documentation, see the Liz::OCASet::Address object itself.

Input Parameters

 1 ID to create Address object with
   (default: new address)
Output Parameters

 1 instantiated Liz::OCASet::Address object
Example

 $xxlink = new xxLINK;
 $ocaset = $xxlink->OCASet( 'customers' );

 $address = $ocaset->Address;
 $address = $ocaset->Address( $addressID );


Contact

Create a new Liz::OCASet::Contact object, either from existing information or for a new entry. For more documentation, see the Liz::OCASet::Contact object itself.

Input Parameters

 1 ID/lastname to create Contact object with
   (default: none = new contact)
 2 firstname to create Contact object with
   (default: none)
 3 prefix to create Contact object with
   (default: none)
 4 sortname of contact (name on which contact should be sorted)
   (default: same as name if 1st parameter is name)
Output Parameters

 1 instantiated Liz::OCASet::Contact object
Example

 $xxlink = new xxLINK;
 $ocaset = $xxlink->OCASet( 'customers' );

 $contact = $ocaset->Contact;
 $contact = $ocaset->Contact( 'Mattijsen','Elizabeth' );
 $contact = $ocaset->Contact( $contactID );


Organization

Create a new Liz::OCASet::Organization object, either from existing information or for a new entry. For more documentation, see the Liz::OCASet::Organization object itself.

Input Parameters

 1 ID/name to create Organization object with
   (default: none = new organization)
 2 sortname of contact (name on which organization should be sorted)
   (default: same as name if 1st parameter is name)
Output Parameters

 1 instantiated Liz::OCASet::Organization object
Example

 $xxlink = new xxLINK;
 $ocaset = $xxlink->OCASet( 'customers' );

 $organization = $ocaset->Organization;
 $organization = $ocaset->Organization( 'xxLINK Internet Services' );
 $organization = $ocaset->Organization( $organizationID );


EXTRA EMAIL ADDRESS METHODS

The following methods allow extra email addresses to be associated with the ID's of the sub-objects. They're usually used internally.


AddExtraEmail

Associate an extra email address with a Contact or Organization ID. Optionally specify a type of email address.

If the email address existed already as an extra email address for the specified ID, then only the type of extra email address will be updated (if specified).

Use method ExtraEmail to return which email addresses are associated with a Contact or Organization object.

Input Parameters

 1    ID to associate extra email address with (optional)
      (default: ID of object itself)
 2    type of extra email address (optional)
      (default: none, text may not contain @ as that indicates a valid email address)
 3..N extra email addresses to add
Example

 $ocaset->AddExtraEmail( $contactID,'liz@inc.nl' );
 $ocaset->AddExtraEmail( $contactID,'old','liz@iksx.nl' );
 $ocaset->AddExtraEmail( $contactID,'home','liz@metal.xxLINK.nl' );


DeleteExtraEmail

Delete one, more or all email address(es) that are associated with a Contact or Organization ID. Optionally specify a type of email address.

If the email address existed already as an extra email address for the specified ID, then only the type of extra email address will be updated (if specified).

Use method ExtraEmail to return which email addresses are associated with a Contact or Organization object.

Input Parameters

 1    ID to delete associated extra email address from (optional)
      (default: ID of object itself)
 2    type of extra email address to remove (optional)
      (default: all types, may not contain @'s as they indicate email addresses)
 3..N extra email addresses to delete
      (default: all of specified type)
Example

 $ocaset->DeleteExtraEmail( $contactID );
 $ocaset->DeleteExtraEmail( $contactID,'old' );
 $ocaset->DeleteExtraEmail( $contactID,'liz@metal.xxLINK.nl' );


ExtraEmail

Return a reference to a list of extra email addresses associated with a Contact or Organization ID. Optionally returns a reference to a hash with email address types, keyed to the email address.

Use method AddExtraEmail to add an extra email address. Use method DeleteExtraEmail to delete extra email address.

Input Parameters

 1 ID to return extra email address of (optional)
   (default: ID of object itself)
 2 type of extra email address to return list of (optional)
   (default: all types, may not contain @'s as they indicate email addresses)
Output Parameters

 1 reference to a list of email addresses
 2 reference to a hash with email address type
Example

 ($email,$type) = $ocaset->ExtraEmail( $contactID );
 foreach( @{$email} ) {
   print "$_ ($$type{$_})\n";
 }


ExtraEmailList

Return an SQL handle for a list of all the extra email addresses that are available. Optionally allows for checking only certain ID's, email addresses or extra emailtype's.

Input Parameters

 1 fields to be returned
   (default: ID,email,emailtypeID)
 2 extra SQL to use in query
   (default: none)
Output Parameters

 1 SQL result handle
Example

 ($list,$hash) = $ocaset->ExtraEmailType2ListHash;
 $result = $ocaset->ExtraEmailList;
 while (($ID,$email,$emailtypeID) = $result->fetchrow) {
   print "$email belongs to ID $ID and is of type '$$hash{$emailtypeID}'\n";
 }


ExtraEmailType

Return a list of types of extra email address types currently defined (e.g. handy for pulldown menu's or radio buttons) or return the extra email type of a specific extra email address.

Output Parameters

 1..N types of extra email currently available
Example

 @types = $ocaset->ExtraEmailType;
Note

Does not return the empty extra email type, even if extra email addresses exist without specific type.


ExtraEmailType2ListHash

Return a reference to a list with ID's of the currently available ID's for extra email types and a reference to a hash with the strings for the email types keyed to the ID's.

Output Parameters

 1 reference to list of ID's
 2 reference to hash with names, keyed to ID's
Example

 ($list,$hash) = $ocaset->ExtraEmailType2ListHash;
 foreach (@{$list}) {
  print "$$hash{$_} ($_)\n";
 }


ID METHODS

The following methods allow information to be associated with ID's of the sub-objects. They're usually used internally.


EmailAddresses

Return a reference to the (fully qualified) email addresses of the Contact or Organization ID's specified. Usually takes a call to method Values2IDs as input and is itself used as input to the To method of the Liz::BulkMail module.

Input Parameters

 1    flag: whether to return email addresses only (optional)
      (default: fully qualified = 0, email addresses only = 1)
 2..N ID's of Contacts or Organizations to obtain email address from
Output Parameters

 1    reference to list of (fully qualified) email addresses
 2    reference to list of ID's that did not have an email address
Note

The type of the first ID specified will determine the table searched for email addresses. It is therefore not possible to mix Contact and Organization ID's.


GetIDValues

Obtain the values that are associated with a specific ID (either an Address, Contact or Organization object ID). Values are associated with a variable, which is either automatically set in the current namespace (when called in a void context) or returned as values from this method.

Method SetIDValues should be used to set values associated with an ID.

Input Parameters

 1    ID to associate with
 2    name of variable (prefix with $ or @ to indicate scalar or list)
Output Parameters

 1..N values associated with the ID and the variable
      (void: set variable in current namespace)
Example

 $language = $ocaset->GetIDValues( $ID,'$language' );
 $ocaset->GetIDValues( $ID,'$language' );


IDs2Strings

Convert one or more ocaset category ID values to their associated strings. An empty string will be returned for ID value 0.

Input Parameters

 1..N ID values to be converted
Output Parameters

 1..N strings associated with the ID's
Example

 ($gender,$position) = $ocaset->IDs2Strings( $genderID,$positionID );


SetIDValues

Associate one or more values with an ID and a variable name. Use method GetIDValues to obtain the values that were previously associated with the ID and variable name

Input Parameters

 1    ID to associate values with
 2    variable name to be used as key (prefix $ or @ to indicate scalar or list)
 3..N values associated with the ID and variable
      (none: use variable with indicated name in indicated namespace)
Example

 # use the value in the variable $taal
 $ocaset->SetIDValues( $ID,'language',$taal );
Example

 # use the value in the variable $language automagically
 $ocaset->SetIDValues( $ID,'$language' );
Example

 # use the values in the list @language automagically
 $ocaset->SetIDValues( $ID,'@language' );


Values2IDs

Return the ID's with which one or more values of a variable name are associated.

Input Parameters

 1    variable name to be used as key (prefix $ or @ to indicate scalar or list)
 2    flag: whether OR (0) or AND (-1) or number of matches (>0)
      (default: OR)
 3..N values that should be associated with the ID
      (none: use values of variable with indicated name in indicated namespace)
Output Parameters

 1..N ID's that have the value of that variable associated
Example

 @ID = $ocaset->Values2IDs( '$language',0,$language );
 @ID = $ocaset->Values2IDs( '$language' );


INHERITABLE METHODS

The following methods are intended to be used by tyhe submodules of the OCAset module only.


IP

Return the IP number from where the object was last edited.

Output Parameters

 1 IP-number where record was last edited
Example

 $ip = $contact->IP;


AUTHOR

Elizabeth Mattijsen ( lizperl@INC.nl )


COPYRIGHT

(C) 1998-1999 International Network Consultants


HISTORY

Version 0.68, 3 December 1999

Put module name between quotes to fix obscure bug in Perl 5.005x under ModPerl in method new.

Version 0.67, 25 November 1999

Put module name between quotes to fix obscure bug in Perl 5.005x under ModPerl in methods Address, Contact and Organization.

Version 0.66, 30 September 1999

Fixed problem in new that would cause the wrong field names to be set in the associated CategorySet for the parents of ``city'', ``country'' and ``state''. Older OCASets did not suffer from this problem, just newly created ones.

Now no longer adds Exporter to ISA: it wasn't necessary.

Version 0.65, 2 September 1999

Method new now properly uses the NameAlways2ParentIDFields method. This probably caused new entries to be added at the top level in the categoryset. Problem introduced on August 20th.

Version 0.64, 20 August 1999

Changed method new to use the NameAlways2ParentIDFields method when applicable.

Version 0.63, 16 August 1999

Class methods ocasets now only calls Liz:SQLs ``sets'' method.

Method new now creates an object using Liz::SQL's ``new'' method.

Version 0.62, 9 August 1999

Adapted ExtraEmailType so that it can also return the extra email type of a specific extra email address of a specific ID, although this is only intended for the sub-classess Organization and Contact.

Version 0.61, 5 August 1999

Adapted methods SetIDValues and GetIDValues so that they use the field PACKAGE to determine under which category the variable names should be stored.

Version 0.60, 26 July 1999

Changed ExtraEmail to use the new ExtraEmailType2ListHash method.

Added method ExtraEmailList to return a list of extra email addresses that conform to a specific ID or type.

Added method ExtraEmailType2ListHash to create a list and hash of extra emailtype ID's and names.

Version 0.59, 9 July 1999

Removed check for InitID in method new. This was not needed as the Liz::SQL connect method already does this. This should speed up things again a little more.

Changed all CREATE TABLEs to use the new ``create'' method of the Liz::SQL module.

Version 0.58, 8 July 1999

Added method reset for completely resetting the entire database in one go.

Version 0.57, 23 June 1999

Changed from using method ``Exists'' to ``Count'' in method new to more quickly find out whether a table exists or not, especially with large databases.

Version 0.56, 12 May 1999

Upgraded typography of source to new indented format.

Version 0.55, 11 May 1999

Method new now optionally returns a flag to indicate whether the OCASet was just created or not. This is needed to facilitate subclassing with extra fields.

Version 0.54, 10 May 1999

Methods Contacts and Organizations did not return the ``url'' field by default. They now do.

Version 0.53, 5 April 1999

Method methods Addresses, Contacts and Organizations inheritable from submodules.

Added method Authenticate for indicating which routine should be used for authentication.

New class method ocasetexists added: returns flag whether the OCASet with the specified identification name exists.

Changed class method ocasets so that only an undefined value will yield all possible OCASets in the database. Previously, an empty value would do this also. An empty value now is a wildcard for the OCASet with the default identification only. As such, it can also be used to check whether an OCASet with the default identification already exists in the database.

Version 0.52, 4 April 1999

Added method ExtraEmailType: returns list of extra email types currently available.

Version 0.51, 3 April 1999

Added support for IP numbers in tables.

Fixed problem in method ocasets which would cause the OCAset with the default token, not to be listed.

Version 0.5, 2 April 1999

Added method ExtraEmail which returns a reference to the list of email addresses associated with a Contact or Organization object.

Added methods AddExtraEmail and DeleteExtraEmail which allow extra email addresses to be added or removed from Contact or Organization objects.

Added support for extra email addresses with Contact and Organization objects.

Checked all regular expressions and added 'o' flag when appropriate for improved speed, at the expense of extra memory.

Version 0.47, 14 January 1999

Method EmailAddresses now allows a flag to indicate to return the bare email addresses only, instead of email address with a full name. Also, email addresses with full name information are now returned in the form

 name@domain.nl (Firstname Prefix Lastname)

rather than

 Firstname Prefix Lastname <name@domain.nl>

because the latter form chokes on comma's in any part of the name field.

Version 0.46, 7 January 1999

Method ocasets now also returns a reference to a hash with the databaseversion.

Fixed problem in ocasets that would prevent the OCASet with the default identification from being listed.

Version 0.45, 29 December 1998

Fixed problem with method new which would cause a database upgrade when a new OCASet was created.

Version 0.44, 17 December 1998

Now internally sets field ``TOKEN'' with token of database table, so that submodules can easily create their own table names.

Version 0.43, 15 December 1998

Support for OrganizationID added for Liz::OCASet::Organization objects. Tables are now automatically upgraded.

Version 0.42, 4 December 1998

Method EmailAddresses now returns without generating an error if no ID's were specified.

Version 0.41, 30 November 1998

Internal subroutine RawTableName added.

Version 0.4, 13 October 1998

Support for ForeignKey added. This facilitates importing from external databases.

Version 0.31, 6 October 1998

Reduced memory footprint by using fully qualified global variables only.

Version 0.3, 4 October 1998

Moved categories associated with this module to a catogory named ``Liz::OCASet'' to prevent clashes with e.g. the Liz::ProjectSet module.

Removed internal subroutine List: now uses new TableFields2Result method of the Liz::SQL module.

Support for Organization's Department added.

Version 0.2, 30 September 1998

Support for URL's added.

Version 0.1, 28 September 1998

First version of this true Perl module.