lib/trax/model.rb in trax_model-0.0.8 vs lib/trax/model.rb in trax_model-0.0.9
- old
+ new
@@ -2,10 +2,11 @@
require 'default_value_for'
require 'hashie/dash'
require 'hashie/mash'
require 'simple_enum'
require_relative './string'
+# require_relative './enum'
require_relative './validators/email_validator'
require_relative './validators/frozen_validator'
require_relative './validators/future_validator'
require_relative './validators/subdomain_validator'
require_relative './validators/url_validator'
@@ -22,16 +23,39 @@
autoload :Registry
autoload :UUID
autoload :UUIDPrefix
autoload :UniqueId
autoload :Matchable
+ autoload :Mixin
autoload :MTI
+ autoload :Restorable
+ autoload :STI
autoload :Validators
include ::Trax::Model::Matchable
include ::ActiveModel::Dirty
+ class << self
+ attr_accessor :mixin_registry
+ end
+
+ @mixin_registry = {}
+
+ def self.register_mixin(mixin_klass)
+ mixin_key = mixin_klass.name.demodulize.underscore.to_sym
+ mixin_registry[mixin_key] = mixin_klass
+ end
+
+ def self.eager_autoload_mixins!
+ ::Trax::Model::Enum
+ ::Trax::Model::Freezable
+ ::Trax::Model::Restorable
+ ::Trax::Model::UniqueId
+ end
+
+ eager_autoload_mixins!
+
included do
class_attribute :trax_defaults
self.trax_defaults = ::Trax::Model::Config.new
@@ -43,9 +67,33 @@
delegate :[], :to => :find
def defaults(options = {})
options.each_pair do |key, val|
self.trax_defaults.__send__("#{key}=", val)
+ end
+ end
+
+ def mixin(key, options = {})
+ mixin_klass = ::Trax::Model.mixin_registry[key]
+
+ self.class_eval do
+ include(mixin_klass) unless self.ancestors.include?(mixin_klass)
+
+ if(options.is_a?(Hash) && !options.blank?)
+ mixin_klass.apply_mixin(self, options) if mixin_klass.respond_to?(:apply_mixin)
+ end
+ end
+ end
+
+ def mixins(*args)
+ options = args.extract_options!
+
+ if(!options.blank?)
+ options.each_pair do |key, val|
+ self.mixin(key, val)
+ end
+ else
+ args.map{ |key| mixin(key) }
end
end
def register_trax_models(*models)
models.each do |model|