Guest User

Untitled

a guest
Feb 20th, 2018
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.57 KB | None | 0 0
  1. module ModelExtensions
  2.  
  3. # A set of extensions to add handy can_has-style extensions for
  4. # classes. Based on code by Fowlduck and Faithfulgeek pasted in
  5. # #offrails.
  6. def can_has(*args)
  7. options = args.extract_options!
  8. components = _flatten_parameters(args)
  9. components += _flatten_parameters(options)
  10. components = components.map { |c| File.join(self.name.underscore, c) }
  11. components.each do |c|
  12. file = File.join(Rails.root, "app/behaviours", c)
  13. if File.exist?(file + ".rb")
  14. require file
  15. klass = File.join("can_has_extensions", c).camelize.constantize
  16. # Include the appropriate modules.
  17. include klass::InstanceMethods if defined?(klass::InstanceMethods)
  18. extend klass::ClassMethods if defined?(klass::ClassMethods)
  19. # Call implemented! if the method exists.
  20. klass.implemented!(self) if klass.respond_to?(:implement!)
  21. else
  22. Rails.logger.warn "Couldn't load behaviour for #{c.camelize} - File not found at #{file}.rb"
  23. end
  24. end
  25. end
  26.  
  27. private
  28.  
  29. # Recursively flattens the parameters and extracts paths etc.
  30. def _flatten_parameters(item, prefix = "")
  31. extras = []
  32. if item.is_a?(Hash)
  33. extras = item.map do |k,v|
  34. extras = _flatten_parameters(v).map { |i| File.join(k.to_s, i) }
  35. end
  36. elsif item.is_a?(Array)
  37. extras = item.map { |i| i.to_s }
  38. else
  39. extras = [item.to_s]
  40. end
  41. extras = extras.map { |v| File.join(prefix, v) } unless prefix.blank?
  42. return extras.flatten
  43. end
  44.  
  45. end
Add Comment
Please, Sign In to add comment