module StatelessModule

Constants

VERSION

Public Class Methods

extended(base) click to toggle source
# File lib/stateless_module.rb, line 14
def extended(base)
  raise_stateless_module_error
end
included(base) click to toggle source
# File lib/stateless_module.rb, line 3
def included(base)
  base.send(:extend, base)

  freeze_when_module_completes(base)

  base.class_eval do
    class << self
      def included(base)
        raise_stateless_module_error
      end

      def extended(base)
        raise_stateless_module_error
      end

      #######
      private
      #######

      def raise_stateless_module_error
        raise "#{self.name} is a Stateless Module. " \
              "Don't include it elsewhere."
      end
    end
  end
end

Private Class Methods

freeze_when_module_completes(base) click to toggle source
# File lib/stateless_module.rb, line 38
def freeze_when_module_completes(base)
  TracePoint.trace(:end) do |t|
    if base == t.self
      base.freeze

      base.instance_variables.each do |v|
        base.instance_variable_get(v).freeze
      end

      base.class_variables.each do |v|
        base.class_variable_get(v).freeze
      end

      t.disable
    end
  end
end
raise_stateless_module_error() click to toggle source
# File lib/stateless_module.rb, line 22
def raise_stateless_module_error
  raise "#{self.name} is a Stateless Module. " \
        "Don't include it elsewhere."
end