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 )