コンテキストによって返す値を変える関数 - use Want 編が微妙な件

HASHかどうかの判別がなんかへんなのに気がついた。

mainでの判別は問題ないんだけど、ほかのpackageのメッソッド内の map の中だと HASH かどうかの判別ができない。下のコードでは自packageだけど、ほかのクラスの中でkureを読んだ場合も同じように map の中だと HASH かどうかの判別ができない。

なんでだろうーなんでだろうー

WantはPL_op*を覗いてるようでちょっと黒魔法的ですね!

#!/usr/bin/env perl
use strict;
use warnings;
use Perl6::Say;
use IO::File;
STDOUT->autoflush(1);
STDERR->autoflush(1);

MAIN: {
    my $oc = OrenoClass->new(nanka => { sushi => 'hattori' });

    say "* main";
    my $s =    $oc->kure;      # => SCALAR RVALUE
    my %h = %{ $oc->kure };    # => SCALAR REF HASH RVALUE
    map {
        my $s =    $_->kure;   # => SCALAR RVALUE
        my %h = %{ $_->kure }; # => SCALAR REF HASH RVALUE
    } ($oc);
    say "* mainnokurekure";
    mainnokure($oc);

    $oc->kurekure;

    exit;
}

sub mainnokure {
    my $s =    $_[0]->kure;      # => SCALAR RVALUE
    my %h = %{ $_[0]->kure };    # => SCALAR REF HASH RVALUE
    map {
        my $s =    $_->kure;   # => SCALAR RVALUE
        my %h = %{ $_->kure }; # => SCALAR REF HASH RVALUE
    } @_;
}


package OrenoClass;
use Perl6::Say;
use Want;

sub new {
    my($class, %args) = @_;
    return bless {%args}, $class;
}

sub kurekure {
    my($self) = @_;
    say "* kurekure";
    {
        my $s =    $self->kure;   # => SCALAR RVALUE
        my %h = %{ $self->kure }; # => SCALAR REF HASH RVALUE
    }
    map {
        my $s =    $_->kure;      # => SCALAR RVALUE
        my %h = %{ $_->kure };    # => SCALAR RVALUE !!!
    } ($self);
}

sub kure {
    my($self) = @_;

    my @ctx;
    for my $c (qw(
                       VOID
                       SCALAR
                         REF
                           REFSCALAR
                           CODE
                           HASH
                           ARRAY
                           GLOB
                           OBJECT
                         BOOL
                       LIST
                       LVALUE
                       RVALUE
                  )) {
        if (want($c)) {
            push @ctx, $c;
        }
    }
    warn join(" ", @ctx)."\n";

    if (want('HASH')) {
        return +{ %{$self->{nanka}} };
    } else {
        return $self->{nanka}
    }
}