``````package Math::Bacovia::Symbol;

use 5.014;
use warnings;

use Class::Multimethods qw();
use parent qw(Math::Bacovia);

our \$VERSION = \$Math::Bacovia::VERSION;

sub new {
my (\$class, \$name, \$value) = @_;

if (defined(\$value)) {
Math::Bacovia::_check_type(\\$value);
}

bless {
name  => "\$name",
value => \$value,
}, \$class;
}

sub set {
my (\$x, \$value) = @_;
Math::Bacovia::_check_type(\\$value);
\$x->{value} = \$value;
\$x;
}

sub get {
my (\$x) = @_;
defined(\$x->{value})
? (\$x->{name}, \$x->{value})
: \$x->{name};
}

#
## Equality
#

Class::Multimethods::multimethod eq => (__PACKAGE__, __PACKAGE__) => sub {
my (\$x, \$y) = @_;
\$x->{name} eq \$y->{name};
};

Class::Multimethods::multimethod eq => (__PACKAGE__, '*') => sub {
!1;
};

#
## Transformations
#

sub numeric {
my (\$x) = @_;
my \$v = \$x->{value};
defined(\$v) ? \$v->numeric : undef;
}

sub pretty {
\$_[0]->{name};
}

sub stringify {
my (\$x) = @_;

defined(\$x->{value})
? ("Symbol(\"\Q\$x->{name}\E\", " . \$x->{value}->stringify() . ")")
: ("Symbol(\"\Q\$x->{name}\E\")");
}

1;
``````