=begin pod

=head1 NAME

hide-methods - hide methods of classes during runtime

=head1 SYNOPSIS

=begin code :lang<raku>
use hide-methods;

class A {
    method foo() { say "foo" }
}

A.foo;  # foo

hide-methods(A,"foo");
A.foo;  # X::Method::NotFound

class B {
    method bar() { say "bar" }
}

B.bar;  # bar

my $vault = B.&hide-methods("bar");
B.bar;  # X::Method::NotFound

$vault.unhide-methods("bar");
B.bar;  # bar
=end code

=head1 DESCRIPTION

The C<hide-methods> distribution exports a single subroutine called
C<hide-methods>.  Calling this subroutine with a class and one or more
method names, will hide the indicated methods from execution, resulting
in either having a C<X::Method::NotFound> exception thrown, or a method
with the same name called from a parent class (if that doesn't happen
to be hidden as well, of course).

Handles standard method call dispatch and the C<.can> method on classes.
Does B<not> affect dispatch through C<.?>, C<.+> or C<.*>, or listing
with the C<.^methods> method.

=head1 SUBROUTINES

=head2 hide-methods

=begin code :lang<raku>

hide-methods(A,<foo bar baz>);   # hide "foo","bar","baz" methods in A
A.&hide-methods(<foo bar baz>);  # same, using method syntax

my $vault = hide-methods(B,"zippo");  # allow unhiding

$vault.unhide-methods("zippo");  # make B.zippo available again

=end code

The C<hide-methods> subroutine takes a class as the first parameter, and
one or more names of methods to hide.  It returns a C<Vault> object that
supports a C<unhide-methods> method, that takes the names of the methods
that should become available again.

=head1 AUTHOR

Elizabeth Mattijsen <liz@raku.rocks>

Source can be located at: https://codeberg.org/lizmat/hide-methods .
Comments and Pull Requests are welcome.

If you like this module, or what I'm doing more generally, committing to a
L<small sponsorship|https://github.com/sponsors/lizmat/>  would mean a great
deal to me!

=head1 COPYRIGHT AND LICENSE

Copyright 2020, 2021, 2024, 2025, 2026 Elizabeth Mattijsen

This library is free software; you can redistribute it and/or modify it under the Artistic License 2.0.

=end pod

# vim: expandtab shiftwidth=4
