# encoding: utf-8 require_relative "base" module Hexx module Creators # @api hide # @abstract # The base class for both instance and module dependencies. class Dependency < Base # @api hide # @!scope class # @!method add(target, name, default) # Reloads the Base class initializer by adding the default implementation # for the dependency. # # @param (see Hexx::Creators::Base) # @param [Module] default The default implementation for the dependency. # @raise (see Hexx::Creators::Dependency#validate) # @return [Hexx::Creators::Dependency] the dependency object. def initialize(target, name, default) super target, name @default = default end # @!attribute default # The default implementation for the dependency # @return [Module] the default implementation attr_accessor :default # @api hide # Validates parameters for the dependency declaration. # # Adds validation of the dependency default implementation to the # {Hexx::Helper::Base#validate}. # # @raise (see Hexx::Creators::Base#validate) # @raise (see Hexx::Creators::Dependency#check_default) # @return [Hexx::Creators::Dependency] +self+ def validate check_default super end private # @api hide # The dependency getter def getter "def #{ name }; @#{ name } ||= #{ default_name }; return @#{ name } if @#{ name }; fail NotImplementedError .new \"DI: #{ target.name }##{ name } not implemented\"; end" end # @api hide # The dependency setter def setter "def #{ name }=(value); if value.nil? || value.is_a?(Module); @#{ name } = value; #{ name }; else; fail TypeError.new \"DI: \#{ value.inspect } is not a module\"; end; end" end # @api hide # @raise [TypeError] if the default implementation is neither a class, # nor module def check_default return if default.nil? || default.is_a?(Module) fail TypeError.new "#{ default.inspect } is neither a class nor module" end # @api hide # Returns the name of the default implementation of the dependency. def default_name @default_name ||= default ? default.name : "nil" end end end end