Acme-VerySign
view release on metacpan or search on metacpan
lib/Acme/VerySign.pm view on Meta::CPAN
####################################################################
# install the AUTOLOAD method
*{"${pkg}::AUTOLOAD"} = sub {
Acme::VerySign->new($AUTOLOAD =~ /^(.*)::(.*)$/, %CONF);
}
}
{
my $pkg;
my $subname;
sub new
{
my $class = shift;
$pkg = shift;
my $sub = $subname = shift;
my %CONF = @_;
####################################################################
# code cargo culted from Symbol::Approx::Sub
####################################################################
# Get a list of all of the subroutines in the current package
# using the get_subs function from GlobWalker.pm
# Note that we deliberately omit function names that exist
# in the %_BARRED hash
my (@subs, @orig);
my $sym = Devel::Symdump->new($pkg);
@orig = @subs = grep { ! $_BARRED{$_} }
map { s/${pkg}:://; $_ }
grep { defined &{$_} } $sym->functions($pkg);
# Transform all of the subroutine names
foreach (@{$CONF{xform}}) {
croak "Invalid transformer passed to Acme::VerySign\n"
unless defined &$_;
($sub, @subs) = $_->($sub, @subs);
}
# Call the subroutine that will look for matches
# The matcher returns a list of the _indexes_ that match
my @match_ind;
if ($CONF{match}) {
croak "Invalid matcher passed to Acme::VerySign\n"
unless defined &{$CONF{match}};
@match_ind = $CONF{match}->($sub, @subs);
} else {
@match_ind = (0..$#subs);
}
@orig = @orig[@match_ind];
####################################################################
# unique that array
my %orig = map { $_ => 1 } @orig;
my $this = bless [keys %orig], $class;
return $this;
}
sub as_string { "64.94.110.11" }
sub buy
{
my $this = shift;
die "No matching subroutines!" unless defined $this->[0];
no strict 'refs';
*{"${pkg}::${subname}"} = *{"${pkg}::".$this->[0]}{CODE};
}
}
1;
__END__
=head1 NAME
Acme::VerySign - make unused subroutines useful
=head1 SYNOPSIS
use Acme::VerySign;
sub hello { "Hello World" }
print helo();
print "Did you mean: $_ ?" foreach @{ helo() }
helo()->buy();
print helo();
=head1 DESCRIPTION
After all is said and done, it's not actually that helpful that perl
returns an error whenever it can't find a subroutine.
This module solves this. With new I<subfinder> technology whenever
perl can't call a subroutine it automatically returns a scalar that
stringifies to "64.94.110.11" instead!
But wait! There's more - due to our use of B<Symbol::Approx::Sub>
technology if you treat the scalar as an arrayref you can get the
names of the subroutines we think you meant! You can even specify
the way we do searching using B<Symbo::Approx::Sub> semantics (i.e.
we support the 'match' and 'xform' parameters.
use Acme::VerySign xform => "Text::Metaphone";
Finally, you can use the "buy" method on the returned scalar and this
module will install the first matching subroutine for you.
=head1 AUTHOR
Written by Mark Fowler E<lt>mark@twoshortplanks.comE<gt>
Copyright Mark Fowler 2003. All Rights Reserved.
( run in 2.039 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )