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 |