diff options
author | Joshua ben Jore <jjore@cpan.org> | 2007-01-06 05:33:15 -0800 |
---|---|---|
committer | Rafael Garcia-Suarez <rgarciasuarez@gmail.com> | 2007-01-07 23:24:31 +0000 |
commit | 6d39ae0a91d0754337491916b28ae6bf3372c7be (patch) | |
tree | 087ad786dd3766a99189fb7297169ed5d7930f0b | |
parent | 2ba2769ea20cab9d830589a267b2b38118c75056 (diff) | |
download | perl-6d39ae0a91d0754337491916b28ae6bf3372c7be.tar.gz |
less useful
From: "Joshua ben Jore" <twists@gmail.com>
Message-ID: <dc5c751d0701061333w7b89ea48kf5c8993e3de19b44@mail.gmail.com>
p4raw-id: //depot/perl@29709
-rw-r--r-- | lib/less.pm | 140 | ||||
-rw-r--r-- | lib/less.t | 13 |
2 files changed, 147 insertions, 6 deletions
diff --git a/lib/less.pm b/lib/less.pm index de0ac8f423..085e971219 100644 --- a/lib/less.pm +++ b/lib/less.pm @@ -1,24 +1,154 @@ package less; +use strict; +use warnings; -our $VERSION = '0.01'; +our $VERSION = '0.02'; + +sub _pack_tags { + return join ' ', @_; +} + +sub _unpack_tags { + return grep { defined and length } + map { split ' ' } + grep {defined} @_; +} + +sub of { + my $class = shift @_; + + # If no one wants the result, don't bother computing it. + return unless defined wantarray; + + my $hinthash = ( caller 0 )[10]; + my %tags; + @tags{ _unpack_tags( $hinthash->{$class} ) } = (); + + if (@_) { + exists $tags{$_} and return !!1 for @_; + return; + } + else { + return keys %tags; + } +} + +sub import { + my $class = shift @_; + + @_ = 'please' if not @_; + my %tags; + @tags{ _unpack_tags( @_, $^H{$class} ) } = (); + + $^H{$class} = _pack_tags( keys %tags ); + return; +} + +sub unimport { + my $class = shift @_; + + if (@_) { + my %tags; + @tags{ _unpack_tags( $^H{$class} ) } = (); + delete @tags{ _unpack_tags(@_) }; + my $new = _pack_tags( keys %tags ); + + if ( not length $new ) { + delete $^H{$class}; + } + else { + $^H{$class} = $new; + } + } + else { + delete $^H{$class}; + } + + return; +} + +__END__ =head1 NAME -less - perl pragma to request less of something from the compiler +less - perl pragma to request less of something =head1 SYNOPSIS - use less; # unimplemented + use less 'CPU'; =head1 DESCRIPTION -Currently unimplemented, this may someday be a compiler directive -to make certain trade-offs, such as perhaps +This is a user-pragma. If you're very lucky some code you're using +will know that you asked for less CPU usage or ram or fat or... we +just can't know. Consult your documentation on everything you're +currently using. + +For general suggestions, try requesting C<CPU> or C<memory>. use less 'memory'; use less 'CPU'; use less 'fat'; +If you ask for nothing in particular, you'll be asking for C<less +'please'>. + + use less 'please'; + +=head1 FOR MODULE AUTHORS + +L<less> has been in the core as a "joke" module for ages now and it +hasn't had any real way to communicating any information to +anything. Thanks to Nicholas Clark we have user pragmas (see +L<perlpragma>) and now C<less> can do something. + +You can probably expect your users to be able to guess that they can +request less CPU or memory or just "less" overall. + +If the user didn't specify anything, it's interpreted as having used +the C<please> tag. It's up to you to make this useful. + + # equivalent + use less; + use less 'please'; + +=head2 C<< BOOLEAN = less->of( FEATURE ) >> + +The class method C<< less->of( NAME ) >> returns a boolean to tell you +whether your user requested less of something. + + if ( less->of( 'CPU' ) ) { + ... + } + elsif ( less->of( 'memory' ) ) { + + } + +=head2 C<< FEATURES = less->of() >> + +If you don't ask for any feature, you get the list of features that +the user requested you to be nice to. This has the nice side effect +that if you don't respect anything in particular then you can just ask +for it and use it like a boolean. + + if ( less->of ) { + ... + } + else { + ... + } + +=head1 CAVEATS + +=over + +=item This probably does nothing. + +=item This works only on 5.10+ + +At least it's backwards compatible in not doing much. + +=back =cut diff --git a/lib/less.t b/lib/less.t index c801a1bda6..34dc054d3a 100644 --- a/lib/less.t +++ b/lib/less.t @@ -5,6 +5,17 @@ BEGIN { push @INC, '../lib'; } -use Test::More tests => 1; +use Test::More tests => 6; use_ok( 'less' ); + +is_deeply([less->of], [], 'more please'); +use less; +is_deeply([less->of], ['please'],'less please'); +no less; +is_deeply([less->of],[],'more please'); + +use less 'random acts'; +is_deeply([sort less->of],[sort qw(random acts)],'less random acts'); + +is(scalar less->of('random'),1,'less random'); |