Facter is a small software that reports "facts" about your computer. When you run facter, its output looks like the following:
architecture => x86_64 facterversion => 1.5.6 fqdn => cd01.localdomain.lan hardwaremodel => x86_64 hostname => cd01 id => cosimo interfaces => eth0,pan0 ipaddress => 10.0.0.1 ... uptime_hours => 422 uptime_seconds => 1519256 virtual => physical
It is interesting also because it's extensible with your own custom plugins. A custom plugin is just a Ruby file with usually a call to
Facter.add(:kernel) do setcode do require 'rbconfig' case Config::CONFIG['host_os'] when /mswin|win32|dos|cygwin|mingw/i 'windows' else Facter::Util::Resolution.exec("uname -s") end end end
As a little experiment to become more familiar with Ruby and at the same time to enjoy writing some Perl 6, I decided to study the facter project and then port it to Perl6.
That took me a few hours over a couple of weekends, and it's almost completely functional. It is a straight port from the Ruby code, so it doesn't really use the magic powers of Perl6 yet. The idea is to use a different branch, now that I know it well under the hood, and to rewrite it from the ground up in Perl6.
I found out that Ruby code maps very closely to Perl6, apart from the
yield instruction and a different model for static/instance variables. For yield, something that would be close in Perl6 is
gather/take, but I'm not really sure that is the appropriate statement to use.
yield is used in the fact value resolution algorithm, and that is currently the only thing that doesn't work properly in my port. Everything else is in place. Regarding static/instance variables, Ruby uses
@attribute for instance variables, and
@@attribute for static variables. In Perl6, instance variables are denoted with
$.attribute if public, while static variables are package globals, so you can use
Of course, there's a lot more! If you're interested, take a look at the code on Github, the URL is http://github.com/cosimo/perl6-facter.