Sha256: 45b00526b37a271216a55fdc33d13a269a637fb171801e475ed07865e8547f42

Contents?: true

Size: 1.55 KB

Versions: 1

Compression:

Stored size: 1.55 KB

Contents

module SimplestStatus
  module ModelMethods
    def self.included(base)
      Configurator.new(base).configure
    end

    private

    class Configurator < Struct.new(:model)
      def configure
        model.statuses.each do |status|
          set_constant_for status
          define_class_methods_for status
          define_instance_methods_for status
        end

        define_status_label_method
        set_validations
      end

      private

      def set_constant_for(status_info)
        model.send :const_set, status_info.constant_name, status_info.value
      end

      def define_class_methods_for(status_info)
        model.send :define_singleton_method, status_info.symbol do
          where(:status => status_info.value)
        end
      end

      def define_instance_methods_for(status_info)
        define_predicate(status_info)
        define_status_setter(status_info)
      end

      def define_predicate(status_info)
        model.send :define_method, "#{status_info.symbol}?" do
          status == status_info.value
        end
      end

      def define_status_setter(status_info)
        model.send :define_method, status_info.symbol do
          update_attributes(:status => status_info.value)
        end
      end

      def define_status_label_method
        model.send :define_method, :status_label do
          self.class.statuses.label_for(status)
        end
      end

      def set_validations
        model.send :validates, :status, :presence => true, :inclusion => { :in => proc { model.statuses.values } }
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
simplest_status-0.1.0 lib/simplest_status/model_methods.rb