1 package Devel::Declare;
7 our $VERSION = 0.001000;
9 # mirrored in Declare.xs as DD_HANDLE_*
11 use constant DECLARE_NAME => 1;
12 use constant DECLARE_PROTO => 2;
14 use vars qw(%declarators %declarator_handlers);
15 use base qw(DynaLoader);
17 bootstrap Devel::Declare;
20 my ($class, %args) = @_;
22 if (@_ == 1) { # "use Devel::Declare;"
24 foreach my $name (qw(DECLARE_NAME DECLARE_PROTO)) {
25 *{"${target}::${name}"} = *{"${name}"};
28 $class->setup_for($target => \%args);
35 $class->teardown_for($target);
39 my ($class, $target, $args) = @_;
41 foreach my $key (keys %$args) {
42 my $info = $args->{$key};
44 if (ref($info) eq 'ARRAY') {
45 ($flags, $sub) = @$info;
46 } elsif (ref($info) eq 'CODE') {
47 $flags = DECLARE_NAME;
50 die "Info for sub ${key} must be [ \$flags, \$sub ] or \$sub";
52 $declarators{$target}{$key} = $flags;
53 $declarator_handlers{$target}{$key} = $sub;
58 my ($class, $target) = @_;
59 delete $declarators{$target};
60 delete $declarator_handlers{$target};
69 my ($pack, $use, $name, $proto) = @_;
70 my ($name_h, $XX_h) = $declarator_handlers{$pack}{$use}->(
71 $pack, $use, $name, $proto
73 ($temp_pack, $temp_name, $temp_save) = ($pack, [], []);
75 push(@$temp_name, $name);
77 push(@$temp_save, \&{"${pack}::${name}"});
78 no warnings 'redefine';
79 no warnings 'prototype';
80 *{"${pack}::${name}"} = $name_h;
83 push(@$temp_name, 'X');
85 push(@$temp_save, \&{"${pack}::X"});
86 no warnings 'redefine';
87 no warnings 'prototype';
88 *{"${pack}::X"} = $XX_h;
94 my $name = pop(@{$temp_name||[]});
95 die "done_declare called with no temp_name stack" unless defined($name);
96 my $saved = pop(@$temp_save);
97 delete ${"${temp_pack}::"}{$name};
99 no warnings 'prototype';
100 *{"${temp_pack}::${name}"} = $saved;
114 use Devel::Declare qw(list of subs);
116 Calls Devel::Declare->setup_for(__PACKAGE__ => \@list_of_subs);
122 Calls Devel::Declare->teardown_for(__PACKAGE__);
126 Devel::Declare->setup_for($package => \@subnames);
128 Installs declarator magic (unless already installed) and registers
129 "${package}::$name" for each member of @subnames
133 Devel::Declare->teardown_for($package);
135 Deregisters all subs currently registered for $package and uninstalls
136 declarator magic if number of teardown_for calls matches number of setup_for
141 Matt S Trout - <mst@shadowcatsystems.co.uk>
143 Company: http://www.shadowcatsystems.co.uk/
144 Blog: http://chainsawblues.vox.com/
148 This library is free software under the same terms as perl itself