The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package VUser::CORE;
use warnings;
use strict;

# Copyright 2004 Randy Smith
# $Id: CORE.pm,v 1.26 2007-09-21 20:40:19 perlstalker Exp $

use vars qw(@ISA);

our $REVISION = (split (' ', '$Revision: 1.26 $'))[1];
our $VERSION = "0.4.4";

use Pod::Usage;

use VUser::Meta;
use VUser::ResultSet;
use VUser::Extension;
push @ISA, 'VUser::Extension';

sub config_file
{
    my $cfg = shift;
    my $opts = shift;

    print ("Current config file: ", tied (%$cfg)->GetFileName, "\n");
}

sub config_sample
{
    my $cfg = shift;
    my $opts = shift;

    my $fh;
    if (defined $opts->{file}) {
	open ($fh, ">".$opts->{file})
	    or die "Can't open '".$opts->{file}."': $!\n";
    } else {
	$fh = \*STDOUT;
    }

    print $fh <<'CONFIG';
[vuser]
# Enable debugging
debug = yes

# Space delimited list of extensions to load
# extensions = asterisk courier
extensions = courier

CONFIG

    if (defined $opts->{file}) {
	close $fh;
    }
}

sub config_inc {
    my $cfg = shift;
    my $opts = shift;

    my $rs = VUser::ResultSet->new();
    $rs->add_meta(VUser::Meta->new('name' => 'path',
				   'type' => 'string',
				   'description' => 'Include path')
		  );
    foreach my $path (@INC) {
	$rs->add_data([$path]);
    }

    return $rs;
}

sub version
{
    my $cfg = shift;
    my $opts = shift;

    my $rs = VUser::ResultSet->new();
    $rs->add_meta(VUser::Meta->new('name' => 'extension',
				   'type' => 'string',
				   'description' => 'Extension name'));
    $rs->add_meta(VUser::Meta->new('name' => 'version',
				   'type' => 'string',
				   'description' => 'Version number'));
    $rs->add_data(['CORE', $VERSION]);
    return $rs;
}

sub revision
{
    my $cfg = shift;
    my $opts = shift;

    my $rs = VUser::ResultSet->new();
    $rs->add_meta(VUser::Meta->new('name' => 'extension',
				   'type' => 'string',
				   'description' => 'Extension name'));
    $rs->add_meta(VUser::Meta->new('name' => 'version',
				   'type' => 'string',
				   'description' => 'Revision number'));
    $rs->add_data(['CORE', $REVISION]);
    return $rs;
}

sub help
{
#    pod2usage('-verbose' => 1);
    my $cfg = shift;
    my $opts = shift;
    my $keyword = shift; # The 'action' for help is the keyword see details of
    my $eh = shift;

    use FindBin;

    my @keywords = $eh->get_keywords();
    if ($keyword and $eh->is_keyword($keyword)) {
	my $descr = $eh->get_description($keyword);
	print "Run '$FindBin::Script help' to see all available keywords.\n";
	print "Options marked with '*' are required.\n";
	printf "** $keyword - %s\n", defined $descr? $descr : 'No description';
	my @actions = $eh->get_actions($keyword);
	foreach my $action (@actions) {
	    $descr = $eh->get_description($keyword, $action)
		|| 'No description';
	    printf ("%8s - %s\n", $action, $descr);
	    my @opts = $eh->get_options($keyword, $action);
	    foreach my $opt (@opts) {
		$descr = $eh->get_description($keyword, $action, $opt)
		    || 'No Description';
		printf("\t%-16s %s - %s\n",
		       "--$opt",
		       ($eh->is_required($keyword, $action, $opt))? '*' : ' ',
		       $descr);
	    }
	}
    } else {
	print "Run '$FindBin::Script help <keyword>' for more details.\n";
	print "Keywords: \n";
	foreach my $keyword (@keywords) {
	    my $descr = $eh->get_description($keyword) || 'No description';
	    printf ("%18s - %s\n", $keyword, $descr);
		    
	}
    }
}

sub man
{
    my $cfg = shift;
    my $opts = shift;
    my $keyword = shift; # The 'action' for help is the keyword see details of
    my $eh = shift;

    if ($keyword) {
	local $ENV{PERL5LIB} .= ':'.join ':',@INC;
	system('perldoc', 'VUser::'.$keyword);
    } else {
        pod2usage('-verbose' => 2);
    }
}

sub init
{
    my $eh = shift; # ExtHandler
    my %cfg = @_;

    # Config
    $eh->register_keyword('config', 'Get information about the configuration.');
    $eh->register_action('config', 'file', 'Print the current config file.');
    $eh->register_task('config', 'file', \&config_file, 0);

#    $eh->register_action('config', 'sample', 'Print a sample config file.');
#    $eh->register_task('config', 'sample', \&config_sample, 0);
#    $eh->register_option('config', 'sample', 'file', '=s', 0, 'Write the sample to this file.');

    $eh->register_action('config', 'inc', 'Get the include paths');
    $eh->register_task('config', 'inc', \&config_inc, 0);

    # Help
    $eh->register_keyword('help', 'Print help/usage information.');
    $eh->register_action('help', '*', 'Get help for specific keyword.');
    $eh->register_task('help', '*', \&help);

    # Man
    $eh->register_keyword('man', 'Print documentation');
    $eh->register_action('man', '*');
    $eh->register_task('man', '*', \&man);

    # Version
    $eh->register_keyword('version', 'Show version information.');
    $eh->register_action('version', '');
    $eh->register_task('version', '', \&version);
}

sub unload { };

1;

__END__

=head1 NAME

CORE - vuser core extensions

=head1 DESCRIPTION

=head1 AUTHOR

Randy Smith <perlstalker@gmail.com>

=head1 LICENSE
 
 This file is part of vuser.
 
 vuser is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation; either version 2 of the License, or
 (at your option) any later version.
 
 vuser is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with vuser; if not, write to the Free Software
 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

=cut