lib/open_classes/kernel.rb in tbpgr_utils-0.0.7 vs lib/open_classes/kernel.rb in tbpgr_utils-0.0.8

- old
+ new

@@ -16,11 +16,83 @@ # message = 'msg';puts_eval "hoge-#{message}", binding # => "hoge-#{message}" # => "hoge-msg"\n def puts_eval(code, binding) puts exec_eval code, binding end + # define methods to classes. methods have simple return value. + # + # bulk_define_methods [NilClass, FalseClass], :blank?, true + # bulk_define_methods [TrueClass, Numeric], "blank?", false + # + # puts nil.blank? # => true + # puts false.blank? # => true + # puts true.blank? # => false + # puts 1.blank? # => false + # + # bulk_define_methods [NilClass, FalseClass], [:blank?, :present?], [true, false] + # bulk_define_methods [TrueClass, Numeric], [:blank?, :present?], [false, true] + # + # puts nil.blank? # => true + # puts nil.present? # => false + # puts false.blank? # => true + # puts false.present? # => false + # puts true.blank? # => false + # puts true.present? # => true + # puts 1.blank? # => false + # puts 1.present? # => true + # + # bulk_define_methods NilClass, :blank?, true is same as following code + # + # class NilClass + # def blank? + # true + # end + # end + def bulk_define_methods(classes, methods, constants) + validate_bulk_define_classes!(classes) + validate_bulk_define_methods!(methods) + size = get_classes_size(classes) + tmp_classes = fill_same_values(classes, size) + tmp_methods = fill_same_values(methods, size) + tmp_constants = fill_same_values(constants, size) + tmp_classes.each do |klass| + define_method_constants(klass, tmp_methods, tmp_constants) + end + end + + private + def get_classes_size(classes) + size = classes.is_a?(Array) ? classes.size : 1 + end + + def fill_same_values(ary, size) + return ary if ary.is_a?(Array) + tmp = [] + size.times {tmp << ary} + tmp + end + + def validate_bulk_define_classes!(classes) + return if classes.class.any_of?(Array, Class) + fail TypeError, "invalid type #{a.class}. you have to use Array or Class or String or Symbol" + end + + def validate_bulk_define_methods!(methods) + return if methods.class.any_of?(Array, String, Symbol) + fail TypeError, "invalid type #{a.class}. you have to use Array or Class or String or Symbol" + end + + def define_method_constants(klass, methods, constants) + methods.each_with_index do |m, i| + klass.class_eval do + define_method m do |*args| + constants[i] + end + end + end + end + def exec_eval(code, binding) ret = eval code, binding "#{code} # => #{ret.inspect}" end - private :exec_eval end