final public function equals(Enum $b)
    {
        $aClass = get_class($this);
        $bClass = get_class($b);

        if ($aClass !== $bClass) {
            throw new InvalidArgumentException("Unexpected type {$bClass} is not of type {$aClass}.");
        }

        return $b->getName() === $this->getName();
    }