The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Bubblegum::Object::Role::Item;

use 5.10.0;
use namespace::autoclean;

use Bubblegum::Role 'requires';
use Bubblegum::Namespace;

our $VERSION = '0.45'; # VERSION

requires 'defined';

sub class {
    my $self  = CORE::shift;
    my $types = $Bubblegum::Namespace::DefaultTypes;
    return $types->{type($self)};
}

sub of {
    my $self  = CORE::shift;
    my $type  = CORE::shift;
    my $types = $Bubblegum::Namespace::DefaultTypes;

    my $alias = {
        aref  => 'array',
        cref  => 'code',
        href  => 'hash',
        int   => 'integer',
        nil   => 'undef',
        null  => 'undef',
        num   => 'number',
        str   => 'string',
        undef => 'undef',
    };

    $type = $alias->{lc $type} if $alias->{lc $type};

    my $kind  = $types->{uc $type};
    my $class = $self->autobox_class;

    return $kind && $class->isa($kind) ? 1 : 0;
}

sub type {
    my $self = CORE::shift;
    return autobox::universal::type $self;
}

sub typeof {
    goto &of;
}

1;