package Module::New::Meta;

use strict;
use warnings;
use Carp;
use Sub::Install 'reinstall_sub';

my $meta;

sub import {
  my $class  = shift;
  my $caller = caller;

  foreach my $type (qw( methods functions )) {
    reinstall_sub({
      as   => $type,
      into => $caller,
      code => sub ($) {
        my $href = shift;
        foreach my $name (keys %{ $href }) {
          $meta->{$caller}->{$name} = $href->{$name};
        }
      }
    });
  }

  reinstall_sub({
    as   => 'import',
    into => $caller,
    code => sub {
      my $class  = shift;
      my $caller = caller;

      return if $caller eq 'main';
      return if $caller =~ /^Test::/;

      my $my_meta = $meta->{$class};
      foreach my $name (keys %{ $my_meta }) {
        reinstall_sub({
          as   => $name,
          into => $caller,
          code => $my_meta->{$name},
        });
      }
    }
  });
}

1;

__END__

=head1 NAME

Module::New::Meta

=head1 DESCRIPTION

Used internally to install functions/methods.

=head1 AUTHOR

Kenichi Ishigaki, E<lt>ishigaki@cpan.orgE<gt>

=head1 COPYRIGHT AND LICENSE

Copyright (C) 2009 by Kenichi Ishigaki.

This program is free software; you can redistribute it and/or
modify it under the same terms as Perl itself.

=cut