class ValueObjAt
Unique identification for value types
class ValueObjAt is ObjAt { }
A subclass of ObjAt that should be used to indicate that a class produces objects that are value types (in other words: are immutable after they have been initialized.
my %h = a => 42; # mutable Hash
say %h.WHICH; # OUTPUT: «ObjAt.new("Hash|1402...888")»
my %m is Map = a => 42; # immutable Map
say %m.WHICH; # OUTPUT: «ValueObjAt.new("Map|AAF...09F61F")»
If you create a class that should be considered a value type, you should add a WHICH method to that class that returns a ValueObjAt object, for instance:
class YourClass {
has $.foo; # note these are not mutable
has $.bar;
method WHICH() {
ValueObjAt.new("YourClass|$!foo|$!bar");
}
}
Note that it is customary to always start the identifying string with the name of the object, followed by a "|". This to prevent confusion with other classes that may generate similar string values: the name of the class should then be enough of a differentiator to prevent collisions.
Type Graph
ValueObjAtRoutines supplied by class ObjAt
ValueObjAt inherits from class ObjAt, which provides the following routines:
(ObjAt) infix eqv
Defined as:
multi sub infix:<eqv>(ObjAt:D $a, ObjAt:D $b)
Returns True if the two ObjAt are the same, that is, if the object they identify is the same.
my @foo = [2,3,1]; my @bar := @foo; say @foo.WHICH eqv @bar.WHICH; # OUTPUT: «True»