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;
13 use constant DECLARE_NONE => 4;
15 use vars qw(%declarators %declarator_handlers @next_pad_inject);
16 use base qw(DynaLoader);
18 bootstrap Devel::Declare;
21 my ($class, %args) = @_;
23 if (@_ == 1) { # "use Devel::Declare;"
25 foreach my $name (qw(NAME PROTO NONE)) {
26 *{"${target}::DECLARE_${name}"} = *{"DECLARE_${name}"};
29 $class->setup_for($target => \%args);
36 $class->teardown_for($target);
40 my ($class, $target, $args) = @_;
42 foreach my $key (keys %$args) {
43 my $info = $args->{$key};
45 if (ref($info) eq 'ARRAY') {
46 ($flags, $sub) = @$info;
47 } elsif (ref($info) eq 'CODE') {
48 $flags = DECLARE_NAME;
51 die "Info for sub ${key} must be [ \$flags, \$sub ] or \$sub";
53 $declarators{$target}{$key} = $flags;
54 $declarator_handlers{$target}{$key} = $sub;
59 my ($class, $target) = @_;
60 delete $declarators{$target};
61 delete $declarator_handlers{$target};
70 my ($pack, $use, $name, $proto) = @_;
71 my ($name_h, $XX_h, $extra_code)
72 = $declarator_handlers{$pack}{$use}->(
73 $pack, $use, $name, $proto, defined(wantarray)
75 ($temp_pack, $temp_name, $temp_save) = ($pack, [], []);
77 push(@$temp_name, $name);
79 push(@$temp_save, \&{"${pack}::${name}"});
80 no warnings 'redefine';
81 no warnings 'prototype';
82 *{"${pack}::${name}"} = $name_h;
85 push(@$temp_name, 'X');
87 push(@$temp_save, \&{"${pack}::X"});
88 no warnings 'redefine';
89 no warnings 'prototype';
90 *{"${pack}::X"} = $XX_h;
92 if (defined wantarray) {
93 return $extra_code || '0;';
101 my $name = pop(@{$temp_name||[]});
102 die "done_declare called with no temp_name stack" unless defined($name);
103 my $saved = pop(@$temp_save);
104 delete ${"${temp_pack}::"}{$name};
106 no warnings 'prototype';
107 *{"${temp_pack}::${name}"} = $saved;
111 sub inject_into_next_pad {
112 shift; @next_pad_inject = @_;
125 use Devel::Declare qw(list of subs);
127 Calls Devel::Declare->setup_for(__PACKAGE__ => \@list_of_subs);
133 Calls Devel::Declare->teardown_for(__PACKAGE__);
137 Devel::Declare->setup_for($package => \@subnames);
139 Installs declarator magic (unless already installed) and registers
140 "${package}::$name" for each member of @subnames
144 Devel::Declare->teardown_for($package);
146 Deregisters all subs currently registered for $package and uninstalls
147 declarator magic if number of teardown_for calls matches number of setup_for
152 Matt S Trout - <mst@shadowcatsystems.co.uk>
154 Company: http://www.shadowcatsystems.co.uk/
155 Blog: http://chainsawblues.vox.com/
159 This library is free software under the same terms as perl itself