Sha256: 25e0f04b7f91b1e61a4c0ea82150aea44f28e00e7fc20c9768c93df63cec3e25

Contents?: true

Size: 898 Bytes

Versions: 1

Compression:

Stored size: 898 Bytes

Contents

module SlideHero
  module Pluggable
    def create_plugs_for(*klasses)
      klasses.each do |klass|
        method_name = class_name_to_method_name(klass.name)
        fields = initialization_fields_from_class(klass)

        module_eval %{
          def #{method_name}(#{fields})
            points << #{klass}.new(#{fields}).compile
          end
        }
      end
    end

    def class_name_to_method_name(class_name)
      class_name.split("::")[-1].
        gsub(/([A-Z]\w*)([A-Z]\w*)/, '\1_\2').
        downcase
    end

    def initialization_fields_from_class(klass)
      fields = []
      arguments = klass.instance_method(:initialize).parameters.to_h
      fields << "*args" if arguments.has_key?(:req) || arguments.has_key?(:opt)
      fields << "**kwargs" if arguments.has_key?(:key)
      fields << "&block" if arguments.has_key?(:block)
      fields.join(",")
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
slide_hero-0.0.11 lib/slide_hero/pluggable.rb