Sys-Facter
view release on metacpan or search on metacpan
lib/Sys/Facter.pm view on Meta::CPAN
Plugins in these directories should be placed under F<Pfacter> subdirectory,
as it would be for C<@INC> directories.
=back
=cut
sub new {
my ($class, %opts) = @_;
my @modules = @{ $opts{modules} || [] };
my ($hostname, $domainname) = split /\./, (uname)[1], 2;
my $self = bless {
pfact => {
# the first and only pfact detected here
kernel => (uname)[0],
hostname => $hostname,
},
var => {
modules => \@modules,
loaded => {
kernel => 1,
hostname => 1,
},
},
}, $class;
if (defined $domainname) {
$self->{pfact}{domain} = $domainname;
$self->{var}{loaded}{domain} = 1;
}
$self->load(qw{operatingsystem domain});
return $self;
}
#-----------------------------------------------------------------------------
=item C<load(@facts)>
Load and cache specified facts.
If you don't specify any facts at all, Sys::Facter will load all of them.
=cut
sub load {
my ($self, @facts) = @_;
# XXX: yes, this is lower case
my @invalid = grep { not m{^[a-z0-9_]+$} } @facts;
if (@invalid) {
croak "Invalid fact names: @invalid\n";
}
if (not @facts) {
@facts = map { (split m{[/.]})[-2] }
grep { m{/[a-z0-9_]+\.pm$} && -f $_ }
map { glob "$_/Pfacter/*.pm" }
@{ $self->{var}{modules} }, @INC;
}
for my $fact (grep { not $self->{var}{loaded}{$_} } @facts) {
my $module = "Pfacter::$fact";
my ($file) = grep { -f $_ }
map { "$_/Pfacter/$fact.pm" }
@{ $self->{var}{modules} }, @INC;
if (not defined $file) {
carp "Couldn't load fact `$fact'";
next;
}
my $result = eval { require $file; $module->pfact($self) };
die $@ if $@;
$self->{var}{loaded}{$fact} = 1;
if ($result) {
chomp $result;
$self->{pfact}{$fact} = $result;
}
}
}
#-----------------------------------------------------------------------------
=item C<facts()>
Return currently loaded facts as a %hashmap.
=cut
sub facts {
my ($self) = @_;
return $self->{pfact};
}
#-----------------------------------------------------------------------------
=item C<get($fact)>
Return the value of specified fact, loading it if necessary.
=cut
sub get {
my ($self, $fact) = @_;
$self->load($fact);
return $self->{pfact}{$fact};
}
#-----------------------------------------------------------------------------
=item C<${fact_name}()>
( run in 1.790 second using v1.01-cache-2.11-cpan-71847e10f99 )