Module: ActiveFedora::AttributeMethods::ClassMethods
- Defined in:
- lib/active_fedora/attribute_methods.rb
Instance Method Summary collapse
-
#class_method_defined_within?(name, klass, superklass = klass.superclass) ⇒ Boolean
:nodoc:.
-
#dangerous_attribute_method?(name) ⇒ Boolean
A method name is ‘dangerous’ if it is already (re)defined by Active Fedora, but not by any ancestors.
-
#dangerous_class_method?(method_name) ⇒ Boolean
A class method is ‘dangerous’ if it is already (re)defined by Active Record, but not by any ancestors.
-
#inherited(child_class) ⇒ Object
:nodoc:.
-
#initialize_generated_modules ⇒ Object
:nodoc:.
-
#instance_method_already_implemented?(method_name) ⇒ Boolean
Raises an ActiveFedora::DangerousAttributeError exception when an Active Record method is defined in the model, otherwise
false
. -
#method_defined_within?(name, klass, superklass = klass.superclass) ⇒ Boolean
:nodoc:.
Instance Method Details
#class_method_defined_within?(name, klass, superklass = klass.superclass) ⇒ Boolean
:nodoc:
88 89 90 91 92 93 94 95 96 97 98 |
# File 'lib/active_fedora/attribute_methods.rb', line 88 def class_method_defined_within?(name, klass, superklass = klass.superclass) # :nodoc: if klass.respond_to?(name, true) if superklass.respond_to?(name, true) klass.method(name).owner != superklass.method(name).owner else true end else false end end |
#dangerous_attribute_method?(name) ⇒ Boolean
A method name is ‘dangerous’ if it is already (re)defined by Active Fedora, but not by any ancestors. (So ‘puts’ is not dangerous but ‘save’ is.)
66 67 68 |
# File 'lib/active_fedora/attribute_methods.rb', line 66 def dangerous_attribute_method?(name) # :nodoc: method_defined_within?(name, Base) end |
#dangerous_class_method?(method_name) ⇒ Boolean
A class method is ‘dangerous’ if it is already (re)defined by Active Record, but not by any ancestors. (So ‘puts’ is not dangerous but ‘new’ is.)
84 85 86 |
# File 'lib/active_fedora/attribute_methods.rb', line 84 def dangerous_class_method?(method_name) BLACKLISTED_CLASS_METHODS.include?(method_name.to_s) || class_method_defined_within?(method_name, Base) end |
#inherited(child_class) ⇒ Object
:nodoc:
21 22 23 24 |
# File 'lib/active_fedora/attribute_methods.rb', line 21 def inherited(child_class) #:nodoc: child_class.initialize_generated_modules super end |
#initialize_generated_modules ⇒ Object
:nodoc:
26 27 28 29 30 31 32 |
# File 'lib/active_fedora/attribute_methods.rb', line 26 def initialize_generated_modules # :nodoc: @generated_attribute_methods = GeneratedAttributeMethods.new { extend Mutex_m } @attribute_methods_generated = false include @generated_attribute_methods super end |
#instance_method_already_implemented?(method_name) ⇒ Boolean
Raises an ActiveFedora::DangerousAttributeError exception when an Active Record method is defined in the model, otherwise false
.
class Person < ActiveRecord::Base
def save
'already defined by Active Fedora'
end
end
Person.instance_method_already_implemented?(:save)
# => ActiveFedora::DangerousAttributeError: save is defined by Active Record. Check to make sure that you don't have an attribute or method with the same name.
Person.instance_method_already_implemented?(:name)
# => false
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
# File 'lib/active_fedora/attribute_methods.rb', line 48 def instance_method_already_implemented?(method_name) if dangerous_attribute_method?(method_name) raise DangerousAttributeError, "#{method_name} is defined by Active Fedora. Check to make sure that you don't have an attribute or method with the same name." end if superclass == Base super else # If ThisClass < ... < SomeSuperClass < ... < Base and SomeSuperClass # defines its own attribute method, then we don't want to overwrite that. defined = method_defined_within?(method_name, superclass, Base) && !superclass.instance_method(method_name).owner.is_a?(GeneratedAttributeMethods) defined || super end end |
#method_defined_within?(name, klass, superklass = klass.superclass) ⇒ Boolean
:nodoc:
70 71 72 73 74 75 76 77 78 79 80 |
# File 'lib/active_fedora/attribute_methods.rb', line 70 def method_defined_within?(name, klass, superklass = klass.superclass) # :nodoc: if klass.method_defined?(name) || klass.private_method_defined?(name) if superklass.method_defined?(name) || superklass.private_method_defined?(name) klass.instance_method(name).owner != superklass.instance_method(name).owner else true end else false end end |