Sha256: 0d7f1e565b42f1eb63e321df18ebedfe2c25a6d1983c397d27c6a510e357829b

Contents?: true

Size: 1.29 KB

Versions: 2

Compression:

Stored size: 1.29 KB

Contents

module Nyanko
  module Invoker
    class FunctionFinder
      FunctionNotFound = Class.new(StandardError)

      def self.find(context, options)
        new(context, options).find or
          raise FunctionNotFound, "The function for #{options[:functions].inspect} is not found"
      end

      def initialize(context, options)
        @context = context
        @options = options
      end

      def find
        @options[:functions].find do |unit_name, label|
          unit       = find_unit(unit_name)
          identifier = @options[:as] || @context.class
          next unless unit.active?(@context, @options[:active_if_options])
          function = unit.find_function(identifier, label)
          break function if function
        end
      end

      def find_with_dependencies
        find_without_dependencies unless has_inactive_dependent_unit?
      end
      alias_method_chain :find, :dependencies

      def find_unit(name)
        Loader.load(name)
      end

      def has_inactive_dependent_unit?
        dependent_units.any? {|unit| !unit.active?(@context, @options[:active_if_options]) }
      end

      def dependent_units
        dependent_unit_names.map {|name| find_unit(name) }
      end

      def dependent_unit_names
        Array.wrap(@options[:dependencies])
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
nyanko-0.0.4 lib/nyanko/invoker/function_finder.rb
nyanko-0.0.3 lib/nyanko/invoker/function_finder.rb