Sha256: 72d9612c2da20f93d8fa49b921253a9c638b595d6081ddab32da3070a6273fb4

Contents?: true

Size: 1.55 KB

Versions: 1

Compression:

Stored size: 1.55 KB

Contents

module Sham
  class << self
    def parse! value
      if value.is_a?(Array)
        value.map{ |k| parse!(k) }
      elsif value.is_a?(Hash)
        Hash.new value.map{ |k,v| [k, parse!(v)] }
      elsif value.is_a?(Sham::Base)
        value.sham!
      else
        value
      end
    end

    def add_options! klass, options = {}, attributes
      attributes.call.each do |key, value|
        options[key] = parse!(value) unless options.has_key?(key)
      end
    end
  end

  module Shammable
    def self.included(klass)
      klass.extend(ClassMethods)

      (class << klass; self; end).instance_eval do
        attr_accessor :sham_configs

        define_method(:add_sham_config) do |name, config|
          self.sham_configs ||= {}
          self.sham_configs[name] = config
        end

        define_method(:sham_config) do |name|
          if sham_configs && sham_configs.has_key?(name)
            sham_configs[name]
          else
            superclass.sham_config(name)
          end
        end
      end
    end

    module ClassMethods
      def sham! *args
        options = Sham::Util.extract_options!(args)
        type = (args[0] == :build ? args[1] : args[0]) || :default
        build = args[0] == :build || args[1] == :build

        ::Sham.add_options!(name, options, sham_config(type))
        klass = Sham::Util.constantize(options.delete(:type) || self.name)
        if build || !klass.respond_to?(:create)
          klass.new(options)
        else
          klass.create(options)
        end
      end

      alias :sham_alternate! :sham!
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
sham-1.0.1 lib/sham/shammable.rb