develooper Front page | perl.perl5.porters | Postings from December 2001

[PATCH @13746] conditional pragmas

Thread Next
From:
Ilya Zakharevich
Date:
December 31, 2001 15:18
Subject:
[PATCH @13746] conditional pragmas
Message ID:
20011231181809.A29528@math.ohio-state.edu
The patch below is self-documenting.

Enjoy,
Ilya

--- ./MANIFEST-pre	Mon Dec 17 13:14:40 2001
+++ ./MANIFEST	Mon Dec 31 01:14:38 2001
@@ -1034,6 +1034,8 @@ lib/I18N/LangTags/ChangeLog	I18N::LangTa
 lib/I18N/LangTags/List.pm	List of tags for human languages
 lib/I18N/LangTags/README	I18N::LangTags
 lib/I18N/LangTags/test.pl	See if I18N::LangTags works
+lib/if.pm			For "use if"
+lib/if.t			Tests for "use if"
 lib/importenv.pl		Perl routine to get environment into variables
 lib/integer.pm			For "use integer"
 lib/integer.t			For "use integer" testing
--- ./lib/if.pm-pre	Mon Dec 31 01:13:30 2001
+++ ./lib/if.pm	Mon Dec 31 01:18:14 2001
@@ -0,0 +1,48 @@
+package if;
+
+our $VERSION = '0.01';
+
+sub work {
+  my $method = shift() ? 'import' : 'unimport';
+  return unless shift;		# CONDITION
+  my $p = shift;		# PACKAGE
+  eval "require $p" or die;	# Adds .pm etc if needed
+  $p->$method(@_) if $p->can($method);
+}
+
+sub import   { shift; unshift @_, 1; goto &work }
+sub unimport { shift; unshift @_, 0; goto &work }
+
+1;
+__END__
+
+=head1 NAME
+
+if - C<use> a Perl module if a condition holds
+
+=head1 SYNOPSIS
+
+  use if CONDITION, MODULE => ARGUMENTS;
+
+=head1 DESCRIPTION
+
+The construct
+
+  use if CONDITION, MODULE => ARGUMENTS;
+
+has no effect unless C<CONDITION> is true.  In this case the effect is
+the same as of
+
+  use MODULE ARGUMENTS;
+
+=head1 BUGS
+
+The current implementation does not allow specification of the
+required version of the module.
+
+=head1 AUTHOR
+
+Ilya Zakharevich L<mailto:perl-module-if@ilyaz.org>.
+
+=cut
+
--- ./lib/if.t-pre	Mon Dec 31 01:13:30 2001
+++ ./lib/if.t	Mon Dec 31 01:01:38 2001
@@ -0,0 +1,26 @@
+#!./perl
+
+BEGIN {
+    chdir 't' if -d 't';
+    @INC = '../lib';
+}
+
+use Test::More tests => 4;
+
+my $v_plus = $] + 1;
+my $v_minus = $] - 1;
+
+
+ok( eval "use if ($v_minus > \$]), strict => 'subs'; \${'f'} = 12" eq 12,
+    '"use if" with a false condition, fake pragma');
+
+ok( eval "use if ($v_minus > \$]), strict => 'refs'; \${'f'} = 12" eq 12,
+    '"use if" with a false condition and a pragma');
+
+ok( eval "use if ($v_plus > \$]), strict => 'subs'; \${'f'} = 12" eq 12,
+    '"use if" with a true condition, fake pragma');
+
+ok( (not defined eval "use if ($v_plus > \$]), strict => 'refs'; \${'f'} = 12"
+     and $@ =~ /while "strict refs" in use/),
+    '"use if" with a true condition and a pragma');
+

Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About