lib/sugar-high/class_ext.rb in sugar-high-0.4.4.2 vs lib/sugar-high/class_ext.rb in sugar-high-0.4.5

- old
+ new

@@ -1,11 +1,80 @@ +require 'sugar-high/kind_of' + class Class def include_and_extend(the_module, options={}) options[:instance_methods] ||= :InstanceMethods options[:class_methods] ||= :ClassMethods # Mainly include but be flexible main_module = const_get(the_module) include main_module # for an extend_and_include method, change this to extend main_module include main_module.const_get(options[:instance_methods]) if main_module.const_defined?(options[:instance_methods]) extend main_module.const_get(options[:class_methods]) if main_module.const_defined?(options[:class_methods]) end -end +end + +module ClassExt + def is_class?(clazz) + clazz.is_a?(Class) && (clazz.respond_to? :new) + end + + def is_module?(clazz) + clazz.is_a?(Module) && !(clazz.respond_to? :new) + end + + def class_exists?(name) + is_class? Module.const_get(name) + rescue NameError + return false + end + + def module_exists?(name) + is_module? Module.const_get(name) + rescue NameError + return false + end + + def try_class name + return name if name.kind_of?(Class) + found = Module.const_get(name) if name.kind_of_label? + return found if found.is_a?(Class) + rescue + false + end + + def try_module name + return name if name.kind_of?(Module) + found = Module.const_get(name) if name.kind_of_label? + return found if found.is_a?(Module) + rescue + false + end + + def try_module_only name + return name if is_module?(name) + found = Module.const_get(name) if name.kind_of_label? + return found if is_module?(found) + rescue + false + end + + + def find_first_class *names + classes = names.flatten.compact.uniq.inject([]) do |res, class_name| + found_class = try_class(class_name.to_s.camelize) + res << found_class if found_class + res + end + raise "Not one Class for any of: #{names} is currently loaded" if classes.empty? + classes.first + end + + def find_first_module *names + modules = names.flatten.compact.uniq.inject([]) do |res, class_name| + found_class = try_class(class_name.to_s.camelize) + res << found_class if found_class + res + end + raise "Not one Module for any of: #{names} is currently loaded" if modules.empty? + modules.first + end +end \ No newline at end of file