Sha256: 27dc6a8e243c037e24e12231fc2afa3660841d0f95dbe8f2755b846627c5a529

Contents?: true

Size: 1.31 KB

Versions: 1

Compression:

Stored size: 1.31 KB

Contents

require 'active_support/core_ext'

module Pleiades
  module Command
    module NestBlocks
      extend ActiveSupport::Concern

      def scope(*scopes, &block)
        scopes.each { |s| nest_block __callee__, s, &block }
      end
      alias :scope_append scope
      alias :scope_unshift scope

      def action(*actions, &block)
        actions.each { |a| nest_block __callee__, a, &block }
      end

      private

      def default_options
        {
          scope: [],
          action: ''
        }
      end

      def nest_block(method, context, &block)
        @_options = __send__ "merge_#{method}", context
        Pleiades::Command::Router.new(@_options).instance_eval(&block)
      end

      def merge_scope(context)
        operator =
          if /^merge_scope(_append)?$/ =~  __callee__
            :append
          elsif /^merge_scope_unshift$/ =~ __callee__
            :unshift
          end
        __merge__ ->(option) { option[:scope].__send__ operator, context }
      end
      alias :merge_scope_append merge_scope
      alias :merge_scope_unshift merge_scope

      def merge_action(context)
        __merge__ ->(option) { option[:action] = context }
      end

      def __merge__(proc)
        dup_options = @options.deep_dup
        proc.call(dup_options)
        dup_options
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
pleiades-0.1.1 lib/pleiades/core/command/nest_blocks.rb