The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Alien::Zlib;

use strict;
use vars qw[$VERSION];

use File::Spec;

$VERSION = '0.00_01';

### sanity check
### only do this one 'use' time, because we use Alien::Zlib from 
### the Makefile.PL as well...    
sub import {
    require Carp;
    for my $file ( __PACKAGE__->include_files, __PACKAGE__->lib_files ) {
        Carp::croak "Missing file: '$file'\n" unless -e $file;
    }
}

=head1 NAME

Alien::Zlib

=head1 SYNOPSIS

    require Alien::Zlib;
    
    my $prefix  = Alien::Zlib->prefix;
    my $include = Alien::Zlib->include;
    my $lib     = Alien::Zlib->lib;
    
    my $ver     = Alien::Zlib->version;

=head1 DESCRIPTION

This module resolves the non-perl prerequisite C<zlib>.
This allows your program/module to depend on the C<zlib> library and
expect common installers, such as C<CPANPLUS> and C<CPAN.pm> to 
install them for you.

It does so by installing a private copy of the zlib libraries into
it's module directory.

Go to L<http://www.zlib.org> for more information about C<zlib>.

=head1 METHODS

=head2 prefix();

Returns the prefix (ie, the directory) where the C<include> and C<lib>
directores will live.
On a standard unix system, this might be C</usr/local/>

For this module, it will be C<$INC{'Alien/Zlib'}>.

=cut

my $prefix;
sub prefix {
    return $prefix if $prefix;
    
    my $ext = '.pm';
    $prefix = join '/', split '::', __PACKAGE__;
    $prefix = File::Spec->rel2abs( $INC{$prefix.$ext} );
    $prefix =~ s/$ext$//;
    
    return $prefix;
}    

=head2 lib();

Returns the full path to the C<lib> directory for the C<zlib> 
libraries.
On standard unix systems, this might be C</usr/local/lib>

For this module, it will be C<$INC{'Alien/Zlib'}/lib>

=head2 include()

Returns the full path to the C<include> directory for the C<zlib> 
libraries.
On standard unix systems, this might be C</usr/local/include>

For this module, it will be C<$INC{'Alien/Zlib'}/include>

=cut

for my $sub (qw[lib include]) {
    no strict 'refs';
    *$sub = sub {
                my $self = shift;
                return File::Spec->catdir( $self->prefix, $sub );
            };      
}

=head2 version()

Returns the version of the zlib libraries installed by this version
of C<Alien::Zlib>

=cut

sub version { return '1.2.1'; }

=head2 lib_files()

Returns a list of full paths to the files that can be found in the
'Alien::Zlib->lib' directory. This corresponds to all created
libraries.

=head2 include_files()

Returns a list of full paths to the files that can be found in the 
'Alien::Zlib->include' direcotry. This corresponds to all copied
header files.

=cut

my $files = {
    include => [qw|zconf.h zlib.h|],
    lib     => [qw|libz.a|],    
};

for my $acc (qw[include_files lib_files]) {
    no strict 'refs';
    *$acc = sub {
                my $self    = shift;
                my ($type)  = $acc =~ /(\w+)_files/;
                
                return map { 
                            File::Spec->catfile( $self->$type(), $_) 
                        } @{$files->{$type}};
    }
}    

=head1 TODO

=over 4

=item *

Probe for system installed version of C<zlib>

=item *

Gather more C<hints> file to ensure this module builds properly on 
all platforms that C<zlib> builds on.

=head1 AUTHOR

This module by
Jos Boumans E<lt>kane@cpan.orgE<gt>.

=head1 COPYRIGHT

This module is
copyright (c) 2003 Jos Boumans E<lt>kane@cpan.orgE<gt>.
All rights reserved.

This library is free software;
you may redistribute and/or modify it under the same
terms as Perl itself.

=cut

1;