class Stash is Hash { }

A Stash is a hash that is used for symbol tables at the package scoping level in Raku.

To get a Stash, you can call the .WHO pseudo-method on a package (because it answers the question who lives here?), or if you write the package name as a literal, append two colons:

class Boring {
    class Nested { };
    our sub package_sub { }
    my sub lexical { };
    method a_method() { }
}
say Boring::.^name;             # OUTPUT: «Stash␤»
say Boring.WHO === Boring::;    # OUTPUT: «True␤»

Since it inherits from Hash, you can use all the usual hash functionality:

say Boring::.keys.sort;         # OUTPUT: «(&package_sub Nested)␤»
say Boring::<Nested>;           # OUTPUT: «(Nested)␤»

As the example above shows only "our"-scoped things appear in the Stash (nested classes are "our" by default, but can be excluded with "my".) Lexicals and methods are not included in a Stash, since they do not live in the package table. Lexicals live in a separate lexical pad, which is only visible from inside the scope. Methods (in the case that the package is also a class) have a separate method table, and are accessible through introspection on the class itself, via .can and .^methods.

Typegraph§

Type relations for Stash
raku-type-graph Stash Stash Hash Hash Stash->Hash Mu Mu Any Any Any->Mu Cool Cool Cool->Any Iterable Iterable Associative Associative Map Map Map->Cool Map->Iterable Map->Associative Hash->Map

Expand chart above