Sha256: cb27c27d119d7fabc8dda5bfb501e2e24dcd210edb65d7d1c537f660496b9c65

Contents?: true

Size: 1.18 KB

Versions: 1

Compression:

Stored size: 1.18 KB

Contents

module Myrrha
  module Domain
    class Impl < Module

      def initialize(component_names)
        @component_names = component_names.freeze
        define_initialize
        define_component_readers
        include_value_methods
      end

      def included(clazz)
        define_component_names_on(clazz)
        define_coercion_methods_on(clazz)
        super
      end

    private

      def define_initialize
        component_names = @component_names
        define_method(:initialize){|*args|
          component_names.zip(args).each do |n,arg|
            instance_variable_set(:"@#{n}", arg)
          end
        }
      end

      def define_component_readers
        @component_names.each do |n|
          define_method(n){ instance_variable_get(:"@#{n}") }
        end
      end

      def include_value_methods
        module_eval{ include ValueMethods }
      end

      def define_component_names_on(clazz)
        component_names = @component_names
        clazz.define_singleton_method(:component_names){ component_names }
      end

      def define_coercion_methods_on(clazz)
        clazz.extend(CoercionMethods)
      end

    end # class Impl
  end # module Domain
end # module Myrrha

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
myrrha-2.0.0 lib/myrrha/domain/impl.rb