A hyper object is a
named binary link between two objects. Where slot-references and
attribute relations are uni-directed, a hyper may be regarded a two-way object->attribute.
Hypers are used for two purposes:
slave
object. Because the value of the attribute does not know about the main
object, hypers are a suitable solution for circumstances where this
knowledge is required.
As an example of the second case, consider an application that creates a secondary window to allow for editing some object of the main window. If the user is allowed to work in both window and destroy both windows separately, a hyper is a suitable way to maintain the relation between both windows.
The most important behaviour dealing with hypers is defined on class object:
object ->send_hyperBroadcast a message over hypers object <-get_hyperIdem to get information object <-hyperedFind hyperlinks from object
<-to
object. By default the name is the same in both directions. See hyper<-forward_name.<-from.<-from
and hyper<-to
define the two objects related by the hyper-link. object<-hypered
may be used to find hyper-links from the related objects.-from
->save_in_file).
A hyper is saved only if both hyper<-from
and hyper<-to
are saved.<-from
to hyper<-to.
Seen from hyper<-from,
the link is named hyper<-forward_name,
seen from hyper<-to
it is called hyper<-backward_name.
This method will invoke object->attach_hyper
on both objects to register the hyper.
->delete_hyper.
See also hyper->unlink_from
and
hyper->unlink_to.<-to
side is being unlinked.<-from
(hyper->unlink_from)
or the hyper<-to
(hyper->unlink_to)
side of the hyper is being destroyed. Both methods simply destroy the hyper
object.
These methods may be redefined, but always should destroy the hyper
by calling free/1. The
example below defines a subclass between a whole and a part,
where destruction of the whole automatically destroys the part.
:- pce_begin_class(part_hyper, hyper).
unlink_from(H) :->
get(H, to, Part),
free(Part),
free(H).
:- pce_end_class.
A simple example using the code above:
?- send(new(V1, view(hello)), open), send(new(P1, picture(world)), open), new(_, part_hyper(V1, P1, part, whole)). V1 = @435643 P1 = @465732
Now the following call will delete both windows:
?- send(@435643, free).