11# frozen_string_literal: true
22
3- require_relative 'deprecate_soft/version'
4-
5- require_relative 'deprecate_soft/method_wrapper'
3+ # require all files under lib/deprecate_soft
4+ Dir [ File . join ( __dir__ , 'deprecate_soft' , '*.rb' ) ] . sort . each do |file |
5+ require file
6+ end
67
78module DeprecateSoft
8- def configure_base ( base )
9- base . extend ( ClassMethods )
10- base . extend ( InstanceMethods )
11- end
12- module_function :configure_base
13-
14- def included ( base )
15- configure_base ( base )
16- end
17-
18- def extended ( base )
19- configure_base ( base )
20- end
21-
229 class << self
2310 attr_accessor :before_hook , :after_hook
2411 attr_writer :prefix , :suffix
@@ -34,23 +21,58 @@ def suffix
3421 def configure
3522 yield self
3623 end
37- end
3824
39- module InstanceMethods
40- def deprecate_soft ( method_name , message )
41- # protect against declaring deprecate_soft before method is defined
42- return unless method_defined? ( method_name ) || private_method_defined? ( method_name )
25+ def prefixed_name ( method_name )
26+ "#{ prefix } #{ method_name } _#{ suffix } " . to_sym
27+ end
28+
29+ def included ( base )
30+ base . extend ( ClassMethods )
4331
44- DeprecateSoft ::MethodWrapper . wrap_method ( self , method_name , message , is_class_method : false )
32+ base . define_singleton_method ( :method_added ) do |method_name |
33+ pending = base . instance_variable_get ( :@__pending_soft_wraps )
34+ if pending &.key? ( method_name )
35+ DeprecateSoft ::MethodWrapper . wrap_method ( base , method_name , pending . delete ( method_name ) , is_class_method : false )
36+ end
37+ super ( method_name ) if defined? ( super )
38+ end
39+
40+ base . singleton_class . define_method ( :singleton_method_added ) do |method_name |
41+ pending = instance_variable_get ( :@_pending_soft_wraps )
42+ if pending &.key? ( method_name )
43+ DeprecateSoft ::MethodWrapper . wrap_method ( base , method_name , pending . delete ( method_name ) , is_class_method : true )
44+ end
45+ super ( method_name ) if defined? ( super )
46+ end
4547 end
4648 end
4749
4850 module ClassMethods
49- def deprecate_soft ( method_name , message )
50- # protect against declaring deprecate_soft before method is defined
51- return unless singleton_class . method_defined? ( method_name ) || singleton_class . private_method_defined? ( method_name )
51+ def deprecate_soft ( method_name , message = nil )
52+ hidden = DeprecateSoft . prefixed_name ( method_name )
53+
54+ if method_defined? ( method_name ) || private_method_defined? ( method_name )
55+ return if method_defined? ( hidden ) || private_method_defined? ( hidden )
56+
57+ DeprecateSoft ::MethodWrapper . wrap_method ( self , method_name , message , is_class_method : false )
58+ else
59+ @__pending_soft_wraps ||= { }
60+ @__pending_soft_wraps [ method_name ] = message
61+ end
62+ end
63+
64+ def deprecate_class_soft ( method_name , message = nil )
65+ hidden = DeprecateSoft . prefixed_name ( method_name )
66+ target = singleton_class
67+
68+ if target . method_defined? ( method_name ) || target . private_method_defined? ( method_name )
69+ return if target . method_defined? ( hidden ) || target . private_method_defined? ( hidden )
5270
53- DeprecateSoft ::MethodWrapper . wrap_method ( self , method_name , message , is_class_method : true )
71+ DeprecateSoft ::MethodWrapper . wrap_method ( self , method_name , message , is_class_method : true )
72+ else
73+ @_pending_soft_wraps ||= { }
74+ @_pending_soft_wraps [ method_name ] = message
75+ end
5476 end
5577 end
5678end
0 commit comments