package UNIX::Cal;
use strict;

# Ensure that the build directory exists
BEGIN { `mkdir /tmp/_Inline` if ! -d '/tmp/_Inline' }

use vars qw($VERSION);
$VERSION = '0.01';

use Cwd qw(abs_path); 

# Config for Inline::MakeMaker
use Inline C=> 'DATA',
                NAME => 'UNIX::Cal',
		MYEXTLIB => abs_path((-d "./mylib" ? "./mylib" :"."))."/libcal.a",
                VERSION => '0.01';

my $mflag = 0;
my $jflag = 0;
my $yflag = 0;

my $onload;

my @export_ok = ("cal");

=head1 NAME

UNIX::Cal - Perl wrapper for the original cal UNIX command line tool

=head1 SYNOPSIS

  use Data::Dumper;
  use UNIX::Cal;
  use UNIX::Cal qw(monday julian year);
 
  print Dumper(cal());

=head1 DESCRIPTION

UNIX::Cal is an implementation of good ol' UNIX command line cal.

It is really paying homage to the original code from
   The Regents of the University of California
   and
   Berkeley by Kim Letkeman.

As with UNIX cal, you can specify the switches to change the behaviour

use UNIX::Cal qw(monday);  give the -m switch effect.

  -m  = monday  - set monday as the first day of the week
  -j  = julian  - generate the days in julian format
  -y  = year    - automatically create a years calendar

There is only one method - cal().  This method is pushed into the calling packages
namespace, so it doesn't need to be fully qualified.
cal() is called in three forms:

 cal();   - no arguments gives the current month unless -y was specified.
 cal(5, 2002); - returns the calendar for May, 2002.
 cal(2002); - returns the calendar ( each month ) for 2002.


The result of the cal() method is an array ref.

For a single months results:
 $VAR1 = [
           [ 'May', 2002 ],
           [ 'Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa' ],
           [ '', '', '', 1, 2, 3, 4 ],
           [ 5, 6, 7, 8, 9, 10, 11 ],
           [ 12, 13, 14, 15, 16, 17, 18 ],
           [ 19, 20, 21, 22, 23, 24, 25 ],
           [ 26, 27, 28, 29, 30, 31, '' ]
         ];

The results for a year are like so:
 $VAR1 = [
           [ 2002 ],
           [
             [ 'January', 2002 ],
             [ 'Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa' ],
             [ '', '', 1, 2, 3, 4, 5 ],
             [ 6, 7, 8, 9, 10, 11, 12 ],
             [ 13, 14, 15, 16, 17, 18, 19 ],
             [ 20, 21, 22, 23, 24, 25, 26 ],
             [ 27, 28, 29, 30, 31, '', '' ]
           ],
           [
             [ 'February', 2002 ],
             [ 'Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa' ],
             [ '', '', '', '', '', 1, 2 ],
             [ 3, 4, 5, 6, 7, 8, 9 ],
             [ 10, 11, 12, 13, 14, 15, 16 ],
             [ 17, 18, 19, 20, 21, 22, 23 ],
             [ 24, 25, 26, 27, 28, '', '' ]
           ],
        ...................


=head1 VERSION

very new

=head1 AUTHOR

Piers Harding

=head1 SEE ALSO

man cal

=cut


sub import {

  my %parms = ();

  map { $parms{$_} = 1 } @_;

  $mflag = 1 if exists $parms{'monday'};
  $jflag = 1 if exists $parms{'julian'};
  $yflag = 1 if exists $parms{'year'};


  my ( $caller ) = caller;

  no strict 'refs';
  foreach my $sub ( @export_ok ){
    *{"${caller}::${sub}"} = \&{$sub};
  }

}

# Create a component profile
#  passing in all the connection information
# and the name of the callback routine for handling the packet
sub cal {

  my ($month, $year);
  die "usage: cal(month, year) or cal(year) \n" if scalar @_ > 2;
  if ( scalar @_ == 2 ){
    ($month, $year) = @_;
  } else {
    ($year, $month) = (@_, 0, 0);
  }

  on_load( $mflag, $jflag, $yflag ) unless $onload++;
  return do_cal( $month, $year );

}

1;

__DATA__

__C__

SV* on_load(SV* month, SV* julian, SV* year){

    return newSViv(onLoad(SvIV(month), 
                          SvIV(julian),
			  SvIV(year))); 

}

SV* do_cal(SV* month, SV* year){

    return doCal(SvIV(month), SvIV(year));

}