aderyabin/smart_methods

View on GitHub
lib/smart_methods.rb

Summary

Maintainability
A
1 hr
Test Coverage
module SmartMethods
  def smart_methods(*names)
    names.each do |name|
      instance_eval %Q{
        def #{name}(v = nil, &block)
          if block_given?
            @#{name} = block
          elsif v
            @#{name} = v
          else
            return @#{name} unless superclass.respond_to?(:#{name}) and value = superclass.#{name}
            @#{name} ||= value.clone
          end
        end

        def #{name}=(v)
          @#{name} = v
        end
      }

      class_eval %Q{
        def #{name}
          return @#{name} if @#{name}
          if self.class.#{name}.is_a?(Proc)
            @#{name} = instance_eval(&self.class.#{name})
          else
            @#{name} = self.class.#{name}
          end
        end

        def #{name}=(v)
          @#{name} = v
        end
      }
    end
  end
end