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 )