Acme-Magpie
view release on metacpan or search on metacpan
lib/Acme/Magpie.pm view on Meta::CPAN
package Acme::Magpie;
use strict;
use vars qw/$VERSION %Nest %symtab/;
$VERSION = '0.06';
use constant debug => 0;
use Devel::Symdump;
sub import {
my $self = shift;
my $steal_from = caller;
for my $sym ( sort Devel::Symdump->rnew($steal_from)->functions() ) {
next unless $sym =~ /^\Q$steal_from/;
print "$sym\n" if debug;
if ( $self->shiny($sym) ) {
print "stealing $sym\n" if debug;
my ($pkg, $name) = $sym =~ /^(.*::)(.*)$/;
local %symtab;
{
no strict 'refs';
*symtab = \%{ $pkg };
}
$Nest{ $sym } = delete $symtab{ $name };
}
}
}
sub unimport {
for my $sym (sort keys %Nest) {
my ($pkg, $name) = $sym =~ /^(.*::)(.*)$/;
local %symtab;
{
no strict 'refs';
*symtab = \%{ $pkg };
}
$symtab{ $name } = delete $Nest{ $sym };
}
}
sub shiny {
return rand > 0.95;
}
1;
__END__
=head1 NAME
Acme::Magpie - steals shiny things
=head1 SYNOPSIS
use Acme::Magpie;
# oh no, some of the shiny methods have gone away
no Acme::Magpie;
# phew, they're back now
=head1 DESCRIPTION
The Magpie is a bird known for stealing shiny things to build its nest
from, Acme::Magpie attempts to be a software emulation of this
behaviour.
When invoked Acme::Magpie scans the symbol tables of your program and
stores attractive (shiny) methods in the %Acme::Magpie::Nest hash.
Shinyness is determined by the return value of the shiny method
this can be redefined by child classes:
package Acme::Magpie::l33t;
use strict;
use base qw(Acme::Magpie);
sub shiny {
( run in 1.959 second using v1.01-cache-2.11-cpan-39bf76dae61 )