module NRSER::Meta::ClassAttrs::ClassMethods

Class methods to extend the receiver with when {NRSER::Meta::ClassAttrs} is included.

Public Instance Methods

class_attr_accessor(attr, default: NRSER::NO_ARG, default_from: NRSER::NO_ARG) click to toggle source
# File lib/nrser/meta/class_attrs.rb, line 75
    def class_attr_accessor attr,
                            default: NRSER::NO_ARG,
                            default_from: NRSER::NO_ARG
      
      var_name = "@#{ attr }".to_sym
      
      singleton_class.class_eval do
        define_method(attr) do |*args|
          case args.length
          when 0
            instance_variable_lookup  var_name,
                                      default: default,
                                      default_from: default_from
          when 1
            instance_variable_set var_name, args[0]
          else
            raise ArgumentError.new NRSER.squish <<-END
              wrong number of arguments
              (given #{ args.length }, expected 0 or 1)
            END
          end
        end
        
        define_method("#{ attr }=") do |value|
          instance_variable_set var_name, value
        end
      end
    end
class_attr_writer(attr) click to toggle source
# File lib/nrser/meta/class_attrs.rb, line 104
def class_attr_writer attr
  var_name = "@#{ attr }".to_sym
  
  singleton_class.class_eval do
    define_method("#{ attr }=") do |value|
      instance_variable_set var_name, value
    end
  end
end
instance_variable_lookup(name, default: NRSER::NO_ARG, default_from: NRSER::NO_ARG) click to toggle source
# File lib/nrser/meta/class_attrs.rb, line 28
    def instance_variable_lookup  name,
                                  default: NRSER::NO_ARG,
                                  default_from: NRSER::NO_ARG
      
      # If it's defined here on self, return that
      if instance_variable_defined? name
        return instance_variable_get name
      end
      
      # Ok, now to need to look for it.
      
      # See if the superclass has the lookup method
      if superclass.respond_to? :instance_variable_lookup
        # It does. See what we get from that. We create a new object to use
        # as a flag and assign it to `default` so we can tell if the search
        # failed.
        not_found = Object.new
        result = superclass.instance_variable_lookup name, default: not_found
        
        # If we found something, return it.
        return result unless result == not_found
        
      end # if superclass.respond_to? :instance_variable_lookup
      
      # Ok, nothing was found.
      
      # See if we can use a default...
      if default != NRSER::NO_ARG || default_from != NRSER::NO_ARG
        # We can use a default.
        # `default` takes precedence.
        if default != NRSER::NO_ARG
          default
        else
          send default_from
        end
        
      else
        # Nope, we can't, raise.
        raise NoMethodError.new NRSER.squish <<-END
          #{ name.inspect } is not defined anywhere in the class hierarchy
        END

      end # if we have a default value / else
      
    end