File: Unload.pm

package info (click to toggle)
libclass-unload-perl 0.05-1
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 148 kB
  • ctags: 101
  • sloc: perl: 1,099; makefile: 15
file content (139 lines) | stat: -rw-r--r-- 2,489 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
package Class::Unload;

use warnings;
use strict;
no strict 'refs'; # we're fiddling with the symbol table

use Class::Inspector;

=head1 NAME

Class::Unload - Unload a class

=head1 VERSION

Version 0.05

=cut

use 5.005;
use vars qw($VERSION);

BEGIN {
	$VERSION = '0.05';
}

=head1 SYNOPSIS

Unload a class

    use Class::Unload;
    use Class::Inspector;

    use Some::Class;

    Class::Unload->unload( 'Some::Class' );
    Class::Inspector->loaded( 'Some::Class' ); # Returns false

    require Some::Class; # Reloads the class

=head1 METHODDS

=head2 unload $class

Unloads the given class by clearing out its symbol table and removing it
from %INC.

=cut

sub unload {
    my ($self, $class) = @_;

    return unless Class::Inspector->loaded( $class );

    # Flush inheritance caches
    @{$class . '::ISA'} = ();

    my $symtab = $class.'::';
    # Delete all symbols except other namespaces
    for my $symbol (keys %$symtab) {
        next if substr($symbol, -2, 2) eq '::';
        delete $symtab->{$symbol};
    }
    
    my $inc_file = join( '/', split /(?:'|::)/, $class ) . '.pm';
    delete $INC{ $inc_file };
    
    return 1;
}

=head1 AUTHOR

Dagfinn Ilmari Mannsker, C<< <ilmari at ilmari.org> >>

=head1 SEE ALSO

L<Class::Inspector>

=head1 BUGS

Please report any bugs or feature requests to C<bug-class-unload at
rt.cpan.org>, or through the web interface at
L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Class-Unload>. I will
be notified, and then you'll automatically be notified of progress on
your bug as I make changes.


=head1 SUPPORT

You can find documentation for this module with the perldoc command.

    perldoc Class::Unload


You can also look for information at:

=over 4

=item * RT: CPAN's request tracker

L<http://rt.cpan.org/NoAuth/Bugs.html?Dist=Class-Unload>

=item * AnnoCPAN: Annotated CPAN documentation

L<http://annocpan.org/dist/Class-Unload>

=item * CPAN Ratings

L<http://cpanratings.perl.org/d/Class-Unload>

=item * Search CPAN

L<http://search.cpan.org/dist/Class-Unload>

=item * Git reposiory

L<http://git.ilmari.org/?p=Class-Unload.git>

C<git://git.ilmari.org/Class-Unload.git>


=back


=head1 ACKNOWLEDGEMENTS

Thanks to Matt S. Trout, James Mastros and Uri Guttman for various tips
and pointers.

=head1 COPYRIGHT & LICENSE

Copyright 2008 Dagfinn Ilmari Mannsker.

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


=cut

1; # End of Class::Unload