In Variables§
See primary documentation in context for The augment declarator
With augment
, you can add methods, but not attributes, to existing classes and grammars, provided you activated the MONKEY-TYPING
pragma first.
Since classes are usually our
scoped, and thus global, this means modifying global state, which is strongly discouraged. For almost all situations, there are better solutions.
# don't do this use MONKEY-TYPING; augment class Int { method is-answer { self == 42 } } say 42.is-answer; # OUTPUT: «True»
(In this case, the better solution would be to use a function).
For a better, and safer example, this is a practical way to create a class module to extend IO::Path
by adding a currently missing method to yield the part of the basename
left after the extension
is removed. (Note there is no clear developer consensus about what to call that part or even how it should be constructed.)
unit class IO::Barename is IO::Path; method new(|c) { return self.IO::Path::new(|c); } use MONKEY-TYPING; augment class IO::Path { method barename { self.extension("").basename; } }