Help language development. Donate to The Perl Foundation

ValueType zef:lizmat last updated on 2021-09-10
[![Actions Status](](


ValueType - A role to create Value Type classes


    use ValueType;

    class Point does ValueType {
        has $.x = 0;
        has $.y = 0;

    say;  # Point|Int|0|Int|0

    # fill a bag with random Points
    my $bag = bag (^1000).map: { x => (-10..10).roll, y => (-10..10).roll
    say $bag.elems;  # less than 1000


The ValueType role mixes the logic of creating a proper ValueType into a class. A class is considered to be a value type if the `.WHICH` method returns an object of the `ValueObjAt` class: that then indicates that objects that return the same `WHICH` value, are in fact identical and can be used interchangeably.

This is specifically important when using set operators (such as `(elem)`, or `Set`s, `Bag`s or `Mix`es, or any other functionality that is based on the `===` operator functionality, such as `unique` and `squish`.

The format of the value that is being returned by `WHICH` is only valid during a run of a process. So it should **not** be stored in any permanent medium.


The first time the `WHICH` method (mixed in by this role) is called, it will check all of its attribute values for being a value type. If they all are, then it will construct a `ValueObjAt` object for its `WHICH` value, save it for future reference, and return it. If any of the attribute values are **not** a value type, then an exception will be thrown.


Elizabeth Mattijsen <[email protected]>

Source can be located at: . Comments and Pull Requests are welcome.


Copyright 2020, 2021 Elizabeth Mattijsen

This library is free software; you can redistribute it and/or modify it under the Artistic License 2.0.