handle undef metaclasses where they are defined in superclass
[gitmo/Class-MOP.git] / lib / Class / MOP / Deprecated.pm
CommitLineData
30229767 1package Class::MOP::Deprecated;
2
3use strict;
4use warnings;
b409c969 5
6use Carp qw( cluck );
7use Scalar::Util qw( blessed );
30229767 8
6f88e1d0 9our $VERSION = '1.01';
30229767 10$VERSION = eval $VERSION;
11our $AUTHORITY = 'cpan:STEVAN';
12
13my %DeprecatedAt = (
14
15 # features deprecated before 0.93
16 'Class::MOP::HAVE_ISAREV' => 0.93,
17 'Class::MOP::subname' => 0.93,
18 'Class::MOP::in_global_destruction' => 0.93,
19
241646a3 20 'Class::MOP::Package::get_method_map' => 0.93,
21
30229767 22 'Class::MOP::Class::construct_class_instance' => 0.93,
23 'Class::MOP::Class::check_metaclass_compatibility' => 0.93,
24 'Class::MOP::Class::create_meta_instance' => 0.93,
25 'Class::MOP::Class::clone_instance' => 0.93,
26 'Class::MOP::Class::alias_method' => 0.93,
27 'Class::MOP::Class::compute_all_applicable_methods' => 0.93,
28 'Class::MOP::Class::compute_all_applicable_attributes' => 0.93,
b1aaf0dc 29 'Class::MOP::Class::get_attribute_map' => 0.95,
30229767 30
31 'Class::MOP::Instance::bless_instance_structure' => 0.93,
32
33 'Class::MOP::Attribute::process_accessors' => 0.93,
34
35 'Class::MOP::Method::Accessor::initialize_body' => 0.93,
36 'Class::MOP::Method::Accessor::generate_accessor_method' => 0.93,
37 'Class::MOP::Method::Accessor::generate_reader_method' => 0.93,
38 'Class::MOP::Method::Accessor::generate_writer_method' => 0.93,
39 'Class::MOP::Method::Accessor::generate_predicate_method' => 0.93,
40 'Class::MOP::Method::Accessor::generate_clearer_method' => 0.93,
41 'Class::MOP::Method::Accessor::generate_accessor_method_inline' => 0.93,
42 'Class::MOP::Method::Accessor::generate_reader_method_inline' => 0.93,
43 'Class::MOP::Method::Accessor::generate_writer_method_inline' => 0.93,
44 'Class::MOP::Method::Accessor::generate_clearer_method_inline' => 0.93,
45 'Class::MOP::Method::Accessor::generate_predicate_method_inline' => 0.93,
46
47 'Class::MOP::Method::Constructor::meta_instance' => 0.93,
48 'Class::MOP::Method::Constructor::attributes' => 0.93,
49 'Class::MOP::Method::Constructor::initialize_body' => 0.93,
50 'Class::MOP::Method::Constructor::generate_constructor_method' => 0.93,
51 'Class::MOP::Method::Constructor::generate_constructor_method_inline' =>
52 0.93,
53
54 # features deprecated after 0.93
55 # ...
56);
57
58my %Registry;
59
60sub import {
61 my ( $class, %args ) = @_;
62
63 if ( defined( my $compat_version = delete $args{-compatible} ) ) {
64 $Registry{ (caller) } = $compat_version;
65 }
66
67 if (%args) {
68 my $unknowns = join q{ }, keys %args;
69 cluck "Unknown argument(s) for $class->import: $unknowns.\n";
70 }
71 return;
72}
73
74sub warn {
75 my ( $package, undef, undef, $feature ) = caller(1);
76
77 my $compat_version;
78 while ( $package && !defined( $compat_version = $Registry{$package} ) ) {
79 $package =~ s/ :: \w+ \z//xms or last;
80 }
81
82 my $deprecated_at = $DeprecatedAt{$feature}
83 or die "Unregistered deprecated feature: $feature";
84
85 if ( !defined($compat_version)
86 || $compat_version >= $DeprecatedAt{$feature} ) {
87 goto &cluck;
88 }
89}
90
91package
92 Class::MOP;
93
94sub HAVE_ISAREV () {
95 Class::MOP::Deprecated::warn(
96 "Class::MOP::HAVE_ISAREV is deprecated and will be removed in a future release. It has always returned 1 anyway."
97 );
98 return 1;
99}
100
101sub subname {
102 Class::MOP::Deprecated::warn(
103 "Class::MOP::subname is deprecated. Please use Sub::Name directly.");
104 require Sub::Name;
105 goto \&Sub::Name::subname;
106}
107
108sub in_global_destruction {
109 Class::MOP::Deprecated::warn(
110 "Class::MOP::in_global_destruction is deprecated. Please use Devel::GlobalDestruction directly."
111 );
112 require Devel::GlobalDestruction;
113 goto \&Devel::GlobalDestruction::in_global_destruction;
114}
115
116package
117 Class::MOP::Package;
118
b409c969 119sub get_method_map {
120 Class::MOP::Deprecated::warn(
121 'The get_method_map method has been made private.'
122 . " The public version is deprecated and will be removed in a future release.\n"
123 );
124 my $self = shift;
125
126 my $map = $self->_full_method_map;
127
128 $map->{$_} = $self->get_method($_)
129 for grep { !blessed( $map->{$_} ) } keys %{$map};
130
131 return $map;
132}
133
30229767 134package
135 Class::MOP::Module;
136
137package
138 Class::MOP::Class;
139
140sub construct_class_instance {
141 Class::MOP::Deprecated::warn(
142 'The construct_class_instance method has been made private.'
143 . " The public version is deprecated and will be removed in a future release.\n"
144 );
145 shift->_construct_class_instance(@_);
146}
147
148sub check_metaclass_compatibility {
149 Class::MOP::Deprecated::warn(
150 'The check_metaclass_compatibility method has been made private.'
151 . " The public version is deprecated and will be removed in a future release.\n"
152 );
153 shift->_check_metaclass_compatibility(@_);
154}
155
156sub construct_instance {
157 Class::MOP::Deprecated::warn(
158 'The construct_instance method has been made private.'
159 . " The public version is deprecated and will be removed in a future release.\n"
160 );
161 shift->_construct_instance(@_);
162}
163
164sub create_meta_instance {
165 Class::MOP::Deprecated::warn(
166 'The create_meta_instance method has been made private.'
167 . " The public version is deprecated and will be removed in a future release.\n"
168 );
169 shift->_create_meta_instance(@_);
170}
171
172sub clone_instance {
173 Class::MOP::Deprecated::warn(
174 'The clone_instance method has been made private.'
175 . " The public version is deprecated and will be removed in a future release.\n"
176 );
177 shift->_clone_instance(@_);
178}
179
180sub alias_method {
181 Class::MOP::Deprecated::warn(
182 "The alias_method method is deprecated. Use add_method instead.\n");
183
184 shift->add_method(@_);
185}
186
187sub compute_all_applicable_methods {
188 Class::MOP::Deprecated::warn(
189 'The compute_all_applicable_methods method is deprecated.'
190 . " Use get_all_methods instead.\n" );
191
192 return map {
193 {
194 name => $_->name,
195 class => $_->package_name,
196 code => $_, # sigh, overloading
197 },
198 } shift->get_all_methods(@_);
199}
200
201sub compute_all_applicable_attributes {
202 Class::MOP::Deprecated::warn(
203 'The compute_all_applicable_attributes method has been deprecated.'
204 . " Use get_all_attributes instead.\n" );
205
206 shift->get_all_attributes(@_);
207}
208
b1aaf0dc 209sub get_attribute_map {
210 Class::MOP::Deprecated::warn(
211 "The get_attribute_map method has been deprecated.\n");
212
213 shift->_attribute_map(@_);
214}
215
30229767 216package
217 Class::MOP::Instance;
218
219sub bless_instance_structure {
220 Class::MOP::Deprecated::warn(
221 'The bless_instance_structure method is deprecated.'
222 . " It will be removed in a future release.\n" );
223
224 my ( $self, $instance_structure ) = @_;
225 bless $instance_structure, $self->_class_name;
226}
227
228package
229 Class::MOP::Attribute;
230
231sub process_accessors {
232 Class::MOP::Deprecated::warn(
233 'The process_accessors method has been made private.'
234 . " The public version is deprecated and will be removed in a future release.\n"
235 );
236 shift->_process_accessors(@_);
237}
238
239package
240 Class::MOP::Method::Accessor;
241
242sub initialize_body {
243 Class::MOP::Deprecated::warn(
244 'The initialize_body method has been made private.'
245 . " The public version is deprecated and will be removed in a future release.\n"
246 );
247 shift->_initialize_body;
248}
249
250sub generate_accessor_method {
251 Class::MOP::Deprecated::warn(
252 'The generate_accessor_method method has been made private.'
253 . " The public version is deprecated and will be removed in a future release.\n"
254 );
255 shift->_generate_accessor_method;
256}
257
258sub generate_reader_method {
259 Class::MOP::Deprecated::warn(
260 'The generate_reader_method method has been made private.'
261 . " The public version is deprecated and will be removed in a future release.\n"
262 );
263 shift->_generate_reader_method;
264}
265
266sub generate_writer_method {
267 Class::MOP::Deprecated::warn(
268 'The generate_writer_method method has been made private.'
269 . " The public version is deprecated and will be removed in a future release.\n"
270 );
271 shift->_generate_writer_method;
272}
273
274sub generate_predicate_method {
275 Class::MOP::Deprecated::warn(
276 'The generate_predicate_method method has been made private.'
277 . " The public version is deprecated and will be removed in a future release.\n"
278 );
279 shift->_generate_predicate_method;
280}
281
282sub generate_clearer_method {
283 Class::MOP::Deprecated::warn(
284 'The generate_clearer_method method has been made private.'
285 . " The public version is deprecated and will be removed in a future release.\n"
286 );
287 shift->_generate_clearer_method;
288}
289
290sub generate_accessor_method_inline {
291 Class::MOP::Deprecated::warn(
292 'The generate_accessor_method_inline method has been made private.'
293 . " The public version is deprecated and will be removed in a future release.\n"
294 );
295 shift->_generate_accessor_method_inline;
296}
297
298sub generate_reader_method_inline {
299 Class::MOP::Deprecated::warn(
300 'The generate_reader_method_inline method has been made private.'
301 . " The public version is deprecated and will be removed in a future release.\n"
302 );
303 shift->_generate_reader_method_inline;
304}
305
306sub generate_writer_method_inline {
307 Class::MOP::Deprecated::warn(
308 'The generate_writer_method_inline method has been made private.'
309 . " The public version is deprecated and will be removed in a future release.\n"
310 );
311 shift->_generate_writer_method_inline;
312}
313
314sub generate_predicate_method_inline {
315 Class::MOP::Deprecated::warn(
316 'The generate_predicate_method_inline method has been made private.'
317 . " The public version is deprecated and will be removed in a future release.\n"
318 );
319 shift->_generate_predicate_method_inline;
320}
321
322sub generate_clearer_method_inline {
323 Class::MOP::Deprecated::warn(
324 'The generate_clearer_method_inline method has been made private.'
325 . " The public version is deprecated and will be removed in a future release.\n"
326 );
327 shift->_generate_clearer_method_inline;
328}
329
330package
331 Class::MOP::Method::Constructor;
332
333sub meta_instance {
334 Class::MOP::Deprecated::warn(
335 'The meta_instance method has been made private.'
336 . " The public version is deprecated and will be removed in a future release.\n"
337 );
338 shift->_meta_instance;
339}
340
341sub attributes {
342 Class::MOP::Deprecated::warn(
343 'The attributes method has been made private.'
344 . " The public version is deprecated and will be removed in a future release.\n"
345 );
346
347 return shift->_attributes;
348}
349
350sub initialize_body {
351 Class::MOP::Deprecated::warn(
352 'The initialize_body method has been made private.'
353 . " The public version is deprecated and will be removed in a future release.\n"
354 );
355 shift->_initialize_body;
356}
357
358sub generate_constructor_method {
359 Class::MOP::Deprecated::warn(
360 'The generate_constructor_method method has been made private.'
361 . " The public version is deprecated and will be removed in a future release.\n"
362 );
363 shift->_generate_constructor_method;
364}
365
366sub generate_constructor_method_inline {
367 Class::MOP::Deprecated::warn(
368 'The generate_constructor_method_inline method has been made private.'
369 . " The public version is deprecated and will be removed in a future release.\n"
370 );
371 shift->_generate_constructor_method_inline;
372}
373
3741;
375
376__END__
377
378=pod
379
380=head1 NAME
381
382Class::MOP::Deprecated - List of deprecated methods
383
384=head1 DESCRIPTION
385
386 use Class::MOP::Deprecated -compatible => $version;
387
388=head1 FUNCTIONS
389
b409c969 390This class provides methods that have been deprecated but remain for backward
391compatibility.
30229767 392
b409c969 393If you specify C<< -compatible => $version >>, you can use deprecated features
394without warnings. Note that this special treatment is limited to the package
395that loads C<Class::MOP::Deprecated>.
30229767 396
397=head1 AUTHORS
398
399Goro Fuji E<lt>gfuji@cpan.orgE<gt>
400
401=head1 COPYRIGHT AND LICENSE
402
3e2c8600 403Copyright 2006-2010 by Infinity Interactive, Inc.
30229767 404
405L<http://www.iinteractive.com>
406
407This library is free software; you can redistribute it and/or modify
408it under the same terms as Perl itself.
409
410=cut