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

use strict;
use warnings;

use File::Copy ();
use File::Path ();
use File::Basename qw(dirname);

=head1 NAME

Alien::Selenium - installing and finding the Selenium Web test framework

=head1 SYNOPSIS

    use Alien::Selenium;

    my $version = Alien::Selenium->version;
    my $path    = Alien::Selenium->path;

    Alien::Selenium->install( $destination_directory );

=head1 DESCRIPTION

Please see L<Alien> for the manifesto of the Alien namespace.

=cut

use strict;

our $VERSION = '0.05';
our $SELENIUM_VERSION = '0.8.2';

=over

=item I<version()>

Returns the version of Selenium that is contained within this Alien
package (not to be confused with $Alien::Selenium::VERSION, which is
the version number of the Perl wrapper)

=cut

sub version { $SELENIUM_VERSION }

=item I<path()>

Returns the path where a file-for-file copy of the Selenium core has
been installed as part of the Alien::Selenium Perl package.  One may
direct one's webserver to serve files directly off I<path()>, or
alternatively use L</install>.

=cut

sub path {
    my $base = $INC{'Alien/Selenium.pm'};

    $base =~ s{\.pm$}{/javascript};

    return $base;
}

=item I<install($destdir)>

Install a copy of the contents of L</path> into $dest_dir, which need
not exist beforehand.

=cut

sub install {
    my( $class, $dest_dir ) = @_;

    File::Path::mkpath $dest_dir;

    my $path = $class->path();
    foreach my $f ( grep { -f $_ }
                         glob "$path/*" ) {
        File::Copy::copy( $f, $dest_dir )
            or die "Can't copy $f to $dest_dir: $!";
    }
}

=item I<path_readystate_xpi()>

Returns the path to the C<readyState.xpi> Mozilla/Firefox extension
that is part of Selenium starting at version 0.8.0.  Returns undef for
versions of Selenium that do not have such a file.

=cut

sub path_readystate_xpi {
    my $base = $INC{'Alien/Selenium.pm'};

    $base =~ s{\.pm$}{/xpi/readyState.xpi};
    return if ! -f $base;
    return $base;
}

=item I<install_readystate_xpi($targetfile)>

Installs the C<readyState.xpi> file as $targetfile, creating any
missing directories if needed.  Croaks if there is no
C<readyState.xpi> in this version of Selenium (see
L</path_readystate_xpi>).

=cut

sub install_readystate_xpi {
    my ($class, $targetfile) = @_;

    die "no readyState.xpi in this version of Selenium ($SELENIUM_VERSION)"
        unless defined(my $srcfile = $class->path_readystate_xpi());

    File::Path::mkpath (dirname($targetfile));
    File::Copy::copy($srcfile, $targetfile)
        or die "Can't copy $srcfile to $targetfile: $!";
}

=back

=head1 AUTHOR

Mattia Barbon <mbarbon@cpan.org>
Dominique Quatravaux <domq@cpan.org>

=head1 LICENSE

Copyright (c) 2005-2006 Mattia Barbon <mbarbon@cpan.org>

This program is free software; you can redistribute it and/or
modify it under the same terms as Perl itself

Please notice that Selenium comes with its own licence.

=cut

1;