class Distribution::Resource { }

A Distribution::Resource is every one of the individual resources (files or libraries) that are returned as values of the %?RESOURCES dynamic variable (which, itself, is an instance of Distribution::Resources. These resources are installed as part of the standard distribution installation process; please check the definition of %?RESOURCES above for more context.

Externally, every one of these resources behaves as an IO::Path, and it shares many of the same methods; however, it's really not an IO::Path and thus cannot be smartmatched to it.

This variable will work with the current repository chain structure, and will give you the right way to get to the resource independently of it being installed or not; however, you shouldn't rely on these values maintaining consistency across implementations. You will be able to access the resource via its handle no matter what. in this example:

unit class Resourceable;
 
method gimme(::?CLASS:U: ) {
    %?RESOURCES;
}

with this META6.json:

{
  "provides": {
    "Resourceable": "lib/Resourceable.rakumod"
  },
  "license": "github:JJ",
  "description": "Testing how Distribution::Resource(s) work",
  "perl": "6.*",
  "auth": "Write me!",
  "version": "0.0.1",
  "resources": [
    "libraries/whatever",
    "data/swim.csv"
  ],
  "meta-version": "0",
  "name": "Resourceable"
}

you see that there are the two kinds of resources available: regular ones, and those starting with libraries, whose actual value (and handle) returned will depend on the operating system it's operating. If we access it through this script (placed in bin/):

use Resourceable;
 
for <libraries/whatever data/swim.csv> -> $resource {
    with Resourceable.gimme{$resource} {
       .say;
       say "-" x 10">";
       ( .repo-name.repo.dist-id.key )».say;
    }
}

run directly from the source directory, like this:

# raku -Ilib bin/show-resources.raku
"/home/jmerelo/progs/raku/my-raku-examples/test-resources/resources/libraries/libwhatever.so".IO
---------->
(Str)
file#/home/jmerelo/progs/raku/my-raku-examples/test-resources/lib
/home/jmerelo/progs/raku/my-raku-examples/test-resources/lib:ver<*>:auth<>:api<*>
libraries/whatever
"/home/jmerelo/progs/raku/my-raku-examples/test-resources/resources/data/swim.csv".IO
---------->
(Str)
file#/home/jmerelo/progs/raku/my-raku-examples/test-resources/lib
/home/jmerelo/progs/raku/my-raku-examples/test-resources/lib:ver<*>:auth<>:api<*>
data/swim.csv

However, if we install the distribution and run the installed script, instead we get something like:

"/home/jmerelo/.rakubrew/versions/moar-2020.05/install/share/perl6/site/resources/7127AA0E7F43E87DF309570E813E46A6E2C4D0B2.so".IO
---------->
site
(Str)
1F8F9C004D7E952B297F30420DA07B354B3F2AA7
libraries/whatever
"/home/jmerelo/.rakubrew/versions/moar-2020.05/install/share/perl6/site/resources/D357F3E46256CB0DACD8975033D1CC7A17B4CF9F.csv".IO
---------->
site
(Str)
1F8F9C004D7E952B297F30420DA07B354B3F2AA7
data/swim.csv

The main difference, as it can be observed, is that "local" distributions have a defined value for repo, while "installed" distributions have a defined value for repo-name. dist-id is going to be different depending on the type of distribution, and in any case .key will return the name of the resources pseudo-hash key.

Please note also that accessing the resource via its key will return a handle on the resource, which gists to a IO::Path but is, in fact, a Distribution::Resource object. Looking again at the "regular" resources, the path it translates to will be the same as the one declared in resources in META6.json, but it will change for "library" resources converting it to the canonical library name corresponding to the value, in the first case libwhatever.so, in the second, a hashed name with the canonical Linux extension, .so.

A Distribution::Resource is designed to be used directly as the resource it represents, such as a file, for instance

my @data = %?RESOURCES<data/swim.csv>.lines.split(",");

However, this is not because it returns a IO::Path, but because it shares many method with it: Str, gist, raku, absolute, is-absolute, relative, is-relative, parts, volume, dirname, basename, extension, open, resolve, slurp, lines, comb, split, words, copy; above we use .lines, for instance.

In the case of resources placed in the libraries/ folder, its main use case is as an argument for is native, as in this example:

use NativeCall;
sub foo() is native(%?RESOURCES<libraries/whatever>)

The Distribution::Resource returned will have the correct name and extension for the specific architecture the distribution is being run.

In general and in any case, the guiding principle is that resources should be used directly for its intended purpose, be it shared libraries or regular resource files.

Methods§

method IO§

method IO()

Returns the corresponding resource as an IO::Path, which can effectively be used as such.