Being a long time Ruby user and Lisp dabbler, Rakudo Perl 6 meta-programming capabilities ranked high on my list of curiosities.

Meta-programming can be described as "writing code that writes code".  This includes code that can alter itself.

I was experimenting and discovered I could not add an attribute to a class at runtime:

class Foo does Metamodel::AttributeContainer {
  submethod BUILD(:$attr) {
    my $a = Attribute.new(:name($attr), :type(Str), :package(Foo));
    self.add_attribute(self, $a);
  }
}

my Foo $foo = Foo.new(:attr('bar'));
$foo.bar = 'baz';  # No such method 'bar' for invocant of type 'Foo'
say $foo.bar;


I found the attribute could be managed in a Hash and if I used return-rw inside FALLBACK I could even return a mutable l-value:

class Foo {
  has %.attrs;
  method FALLBACK(Str:D $name, *@rest) {
    return-rw %!attrs{$name};
  }
}

my $foo = Foo.new;
$foo.bar = 'baz';
say $foo.bar;


Thanks to Jonathan Worthington for the help:

https://stackoverflow.com/questions/57993203/how-to-add-a-class-attribute-dynamically

   Page Updates
Install and setup snmpd on RedHat Enterprise Linux
Install and setup irssi and oidentd on Debian
ORM::ActiveRecord
Template::HAML
BDD::Behave
   Recent Articles
Install xfce4 on Debian
Console Blackjack in Perl
Selenium::WebDriver::Error::UnknownError
Game of Life in C++ using the SDL2
PigPen (dots and boxes) in C++ using the SDL2
   Tags
active-record (2) android (1) apt (1) awk (2) bash (2) bashrc (1) battleship (1) bdd (1) blackjack (12) book (1) books (1) build (1) c (2) c++ (2) cacti (1) capybara (1) clang (1) clang++ (1) console (5) cpp (2) crm (1) crystal (1) data (1) debian (7) diff (1) elixir (1) fedora (1) firewall (1) freebsd (1) g++ (1) game (4) games (1) gcc (1) gem (1) git (3) github (1) gmail (1) go-lang (3) google-chrome (1) haml (1) infix (1) irssi (1) kernel (3) latin1 (1) life (1) linux (4) lottery (1) meta (1) microsoft (1) moarvm (1) model (1) module (1) mongodb (1) mp3s (1) mutt (1) nautical (1) nqp (1) object (1) oidentd (1) operator (1) orm (2) pairing (1) pair-programming (1) patch (1) perl (1) pigpen (1) postgresql (2) powerball (1) programming (1) psql (1) python (2) python3 (1) raku (14) raspberrypi (1) reactjs (2) readline (1) reversi (1) rhel (1) ruby (1) sdl2 (4) sed (1) selenium (1) selinux (1) snmpd (1) split (1) ssh (1) stack (1) template (1) testing (3) tictactoe (1) trace (1) typescript (2) ubuntu (2) utf8 (1) virus (1) war (1) xargs (1) xfce4 (1) xvfb (1) zef (1)
   Twitter

Copyright © 2005 - 2020

GregDonald.com · Contact

All Rights Reserved