module SmartMethods

Constants

VERSION

Public Instance Methods

smart_methods(*names) click to toggle source
# File lib/smart_methods.rb, line 2
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