Sha256: cf7e3c44e87554d2dd2abbe4f16225a0948280844833419f42faba69ae5db0bf

Contents?: true

Size: 1.68 KB

Versions: 2

Compression:

Stored size: 1.68 KB

Contents

require 'liner/version'
require 'liner/base'
require 'liner/hashable'
require 'liner/equalizable'
require 'liner/inspectable'
require 'liner/serializable'
require 'ext/class'

module Liner

  # List of liner attributes as an array of symbols
  # @return [Array]
  def self.liner_keys
    []
  end

  # Apply a liner to a given class
  # @param base [Class] A class to add a liner to
  # @param keys [Array] An array of symbols or strings which will serve as attributes
  # @return [Class] The class with a liner installed
  # @example
  #   Person = Class.new
  #   Liner.apply! Person, :name, :occupation # => Person
  # @api public
  def Liner.apply!(base, *keys)
    keys = keys.map(&:to_sym).uniq

    base.send(:define_singleton_method, :liner_keys) do
      @liner_keys ||= begin
        super() + keys
      rescue NoMethodError
        keys
      end.uniq.freeze
    end

    base.send :include, Liner unless base < Liner

    keys.each do |key|
      unless base.method_defined? key
        base.send(:define_method, key){ liner_get key }
      end
      unless base.method_defined? "#{key}="
        base.send(:define_method, "#{key}="){ |value| liner_set key, value }
      end
    end
    base
  end

  # Setup an anonymous class with liner keys
  # @param keys [Array] An array of symbols or strings which will serve as attributes
  # @return [Class]
  # @example
  #   Liner.new(:foo) # => #<Class:0x007fd0993bab98>
  # @api public
  def Liner.new(*keys)
    apply! Class.new, *keys
  end

  # Includes liner submodules when included
  # @api private
  def self.included(base)
    [Base, Hashable, Equalizable, Inspectable, Serializable].each do |mod|
      base.send :include, mod
    end
  end
end


Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
liner-0.2.2 lib/liner.rb
liner-0.2.1 lib/liner.rb