module Cube::Trait

Public Instance Methods

append_features(mod) click to toggle source
Calls superclass method
# File lib/cube/traits.rb, line 16
def append_features(mod)
  if mod.is_a?(Class) && !mod.is_a?(CubeMethods)
    raise IncludeError, "Traits can only be mixed into cube classes"
  end
  unless mod.instance_variable_defined?(:@__trait_allow_include) &&
    mod.instance_variable_get(:@__trait_allow_include)
    raise IncludeError, "Traits can only be mixed in using method `with_trait`"
  end
  conflicts = public_instance_methods & mod.public_instance_methods
  errors = conflicts.map { |c|
    meth = mod.instance_method(c)
    if meth.owner.is_a?(Class)
      if meth.owner == mod.superclass
        module_exec { remove_method(c) }
      end
      nil
    else
      { meth: meth, owner: meth.owner }
    end
  }.compact
  unless errors.empty?
    message = "\n" + errors.map { |e| e[:meth].to_s }.join("\n")
    raise MethodConflict, message
  end
  if @__interface_trait_required_interface && mod.is_a?(Class)
    intf = @__interface_trait_required_interface
    mod.include?(intf) || mod.as_interface(intf, runtime_checks: false)
  end
  super
end
requires_interface(intf) click to toggle source
# File lib/cube/traits.rb, line 9
def requires_interface(intf)
  unless intf.is_a? Cube::Interface
    raise ArgumentError, "#{intf} is not a Cube::Interface"
  end
  @__interface_trait_required_interface = intf
end