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;
14 use constant DECLARE_PACKAGE => 8+1; # name implicit
16 use vars qw(%declarators %declarator_handlers);
17 use base qw(DynaLoader);
19 bootstrap Devel::Declare;
22 my ($class, %args) = @_;
24 if (@_ == 1) { # "use Devel::Declare;"
26 foreach my $name (qw(NAME PROTO NONE PACKAGE)) {
27 *{"${target}::DECLARE_${name}"} = *{"DECLARE_${name}"};
30 $class->setup_for($target => \%args);
37 $class->teardown_for($target);
41 my ($class, $target, $args) = @_;
43 foreach my $key (keys %$args) {
44 my $info = $args->{$key};
46 if (ref($info) eq 'ARRAY') {
47 ($flags, $sub) = @$info;
48 } elsif (ref($info) eq 'CODE') {
49 $flags = DECLARE_NAME;
52 die "Info for sub ${key} must be [ \$flags, \$sub ] or \$sub";
54 $declarators{$target}{$key} = $flags;
55 $declarator_handlers{$target}{$key} = $sub;
60 my ($class, $target) = @_;
61 delete $declarators{$target};
62 delete $declarator_handlers{$target};
70 my ($usepack, $use, $inpack, $name, $proto) = @_;
71 my ($name_h, $XX_h, $extra_code)
72 = $declarator_handlers{$usepack}{$use}->(
73 $usepack, $use, $inpack, $name, $proto, defined(wantarray)
75 ($temp_name, $temp_save) = ([], []);
77 $name = "${inpack}::${name}" unless $name =~ /::/;
78 push(@$temp_name, $name);
80 push(@$temp_save, \&{$name});
81 no warnings 'redefine';
82 no warnings 'prototype';
86 push(@$temp_name, "${inpack}::X");
88 push(@$temp_save, \&{"${inpack}::X"});
89 no warnings 'redefine';
90 no warnings 'prototype';
91 *{"${inpack}::X"} = $XX_h;
93 if (defined wantarray) {
94 return $extra_code || '0;';
102 my $name = pop(@{$temp_name||[]});
103 die "done_declare called with no temp_name stack" unless defined($name);
104 my $saved = pop(@$temp_save);
107 delete ${"${temp_pack}::"}{$name};
109 no warnings 'prototype';
110 *{"${temp_pack}::${name}"} = $saved;
124 use Devel::Declare qw(list of subs);
126 Calls Devel::Declare->setup_for(__PACKAGE__ => \@list_of_subs);
132 Calls Devel::Declare->teardown_for(__PACKAGE__);
136 Devel::Declare->setup_for($package => \@subnames);
138 Installs declarator magic (unless already installed) and registers
139 "${package}::$name" for each member of @subnames
143 Devel::Declare->teardown_for($package);
145 Deregisters all subs currently registered for $package and uninstalls
146 declarator magic if number of teardown_for calls matches number of setup_for
151 Matt S Trout - <mst@shadowcatsystems.co.uk>
153 Company: http://www.shadowcatsystems.co.uk/
154 Blog: http://chainsawblues.vox.com/
158 This library is free software under the same terms as perl itself