The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Seis::Class;
use strict;
use warnings;
use utf8;
use 5.010_001;
use Seis::MetaClass;

our %INSTANCES;

use overload (
    q{~~} => sub {
        my ($x, $y, $r) = @_;
        if ($r) {
            UNIVERSAL::isa($y, $x->{name});
        } else {
            ...
        }
    },
    q{""} => sub {
        $_[0]->{name} . '()'
    },
    fallback => 1,
);


# DO NOT CALL THIS METHOD DIRECTLY.
sub _new {
    my $class = shift;
    my %args = @_==1 ? %{$_[0]} : @_;
    if ($args{name}) {
        $INSTANCES{$args{name}} //= bless { %args }, $class;
    } else {
        bless { %args }, $class;
    }
}

sub DESTROY { }

our $AUTOLOAD;
sub AUTOLOAD {
    $AUTOLOAD =~ s/.*:://;
    shift->{name}->$AUTOLOAD(@_);
}

sub meta {
    my $self = shift;
    return Seis::MetaClass->new(name => $self->{name});
}

sub gist {
    my $self = shift;
    '(' . $self->{name} . ')';
}

sub perl {
    my $self = shift;
    '(' . ($self->{name} || '-') . ')';
}

1;