Sha256: 0ecc084704aee106a2aa91fc0e9ed5d87414d31223f0583277525073e3b4f973

Contents?: true

Size: 1.51 KB

Versions: 3

Compression:

Stored size: 1.51 KB

Contents

module Registerable
  def self.append_features(base)
    base.class_eval %{
      @@registered = {}
      
      def self.registered
        # protect access to hash
        @@registered.dup
      end

      def self.register(id, klass)
        id = id.to_s.strip
        unless @@registered[id]
          @@registered[id] = klass
          klass.class_eval "def self.registered_id; '\#{id}'; end"
        else
          raise "ID `\#{id}' already registered. Choose another ID."
        end
      end

      def self.find_all
        self.registered.inject([]) { |a, (k, v)| a << v }.sort_by { |f| f.registered_id }
      end
      
      def self.[](id)
        id = id.to_s.strip
        if @@registered.has_key?(id)
          @@registered[id]
        else
          Base
        end
      end
      
      def self.create(id)
        self[id].new
      end
        
      class Base
        def self.register(id)
          #{base.name}.register(id, self)
        end
        
        def self.registered_id
          nil
        end
        
        def registered_id
          self.class.registered_id
        end
      end
    }
    super
  end
end

require 'active_record'
class ActiveRecord::Base
  def self.registered_attr(symbol, registerable_module)
    module_eval %{
      def #{symbol}
        if @#{symbol}.nil? or (@old_#{symbol}_id != #{symbol}_id)
          @old_#{symbol}_id = #{symbol}_id
          @#{symbol} = #{registerable_module}[#{symbol}_id].new
        else
          @#{symbol}
        end
      end
    }
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
radiant-0.5.0 lib/registerable.rb
radiant-0.5.1 lib/registerable.rb
radiant-0.5.2 lib/registerable.rb