The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

NAME

SPOPS::ClassFactory::DBI - Define additional configuration methods

SYNOPSIS

# Put SPOPS::DBI in your isa
my $config = {
      class => 'My::SPOPS',
      isa   => [ 'SPOPS::DBI::Pg', 'SPOPS::DBI' ],
};

DESCRIPTION

This class implements a behavior for the 'links_to' slot as described in SPOPS::ClassFactory.

It is possible -- and perhaps desirable for the sake of clarity -- to create a method within SPOPS::DBI that does all the work that this behavior does, then we would only need to create a subroutine that calls that subroutine.

However, creating routines with the values embedded directly in them should be quicker and more efficient. So we will try it this way.

METHODS

Note: Even though the first parameter for all behaviors is $class, they are not class methods. The parameter refers to the class into which the behaviors will be installed.

conf_relate_links_to( $class )

Slot: links_to

Get the config for $class and find the 'links_to' configuration information. If defined, we auto-generate subroutines to implement the linking functionality.

Typical configuration:

my $config = {
      class    => 'My::SPOPS',
      isa      => [ 'SPOPS::DBI::Pg', 'SPOPS::DBI' ],
      links_to => { 'My::Group' => 'link-table' },
};

This assumes that 'My::OtherClass' has already been created or will be part of the same configuration sent to SPOPS::ClassFactory (or more likely SPOPS::Initialize).

All subroutines generated use the alias used by SPOPS for the class specified in the key. For instance, in the above configuration example we give 'My::Group' as the class specified in the key. So to get the alias for this class we do:

my $alias = My::Group->CONFIG->{main_alias};

We then use $alias to define our method names.

The first method generated is simply named $alias. The method returns an arrayref of objects that the main object links to. For instance:

Example:

# $links_to = 'My::Group' => 'link-table'
# Alias for 'My::Group' = 'group'

my $object = My::SPOPS->fetch( $id );
my $group_list = eval { $object->group };

The second is named '${alias}_add' (e.g., 'group_add') and links the object to any number of other objects. The return value is the number of successful links.

The third is named '${alias}_remove' (e.g., 'group_remove') and removes links from the object to any number of other objects. The return value is the number of successful removals.

Examples:

# First retrieve all groups
my $object = My::SPOPS->fetch( $id );
my $group_list = eval { $object->group };
print "Group list: ", join( ' // ', map { $_->{group_id} } @{ $group_list } );

>> 2 // 3 // 5

# Now add some more, making the thingy a member of these new groups

my $added = eval { $object->group_add( [ 7, 9, 21, 23 ] ) };
print "Group list: ", join( ' // ', map { $_->{group_id} } @{ $group_list } );

>> 2 // 3 // 5 // 7 // 9 // 21 // 23

# Now remove two of them

my $removed = eval { $object->group_remove( [ 2, 21 ] ) };
print "Group list: ", join( ' // ', map { $_->{group_id} } @{ $group_list } );

>> 3 // 5 // 7 // 9 // 23

TO DO

Make 'links_to' more flexible

We need to account for different types of linking; this may require an additional field beyond 'links_to' that has a similar effect but works differently.

For instance, Table-B might have a 'has_a' relationship with Table-A, but Table-A might have a 'links_to' relationship with Table-B. (Themes in OpenInteract work like this.) We need to be able to specify that when Table-A severs its relationship with one or more objects from Table-B, the actual object is removed rather than just a link between them.

BUGS

None known.

COPYRIGHT

Copyright (c) 2001-2002 intes.net, inc.. All rights reserved.

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

AUTHORS

Chris Winters <chris@cwinters.com>

See the SPOPS module for the full author list.