Module: SmartInit

Included in:
Base
Defined in:
lib/smart_init.rb,
lib/smart_init/main.rb,
lib/smart_init/version.rb

Defined Under Namespace

Classes: Base

Constant Summary collapse

VERSION =
"3.4.0"

Instance Method Summary collapse

Instance Method Details

#initialize_with_args(*attributes) ⇒ Object



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/smart_init/main.rb', line 45

def initialize_with_args *attributes
  define_method :initialize do |*parameters|
    if attributes.count != parameters.count
      raise ArgumentError, "wrong number of arguments (given #{parameters.count}, expected #{attributes.count})"
    end

    attributes.zip(parameters).each do |pair|
      name = pair[0]
      value = pair[1]
      instance_variable_set("@#{name}", value)
    end
  end

  instance_eval do
    private

    attr_reader(*attributes)
  end
end

#initialize_with_hash(*attributes) ⇒ Object Also known as: initialize_with



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/smart_init/main.rb', line 14

def initialize_with_hash *attributes
  required_attrs = attributes.select { |attr| attr.is_a?(Symbol) }
  default_value_attrs = attributes.select { |attr| attr.is_a?(Hash) }.first || {}

  define_method :initialize do |*parameters|
    parameters = [{}] if parameters == []
    unless parameters.first.is_a?(Hash)
      raise ArgumentError, "invalid input, expected hash of attributes"
    end

    required_attrs.each do |required_attr|
      unless parameters.first.has_key?(required_attr)
        raise ArgumentError, "missing required attribute #{required_attr}"
      end
    end

    (required_attrs + default_value_attrs.keys).each do |attribute|
      value = parameters.first[attribute] || default_value_attrs[attribute]
      instance_variable_set("@#{attribute}", value)
    end
  end

  instance_eval do
    private

    attr_reader(*(required_attrs + default_value_attrs.keys).compact)
  end
end

#is_callable(opts = {}) ⇒ Object



2
3
4
5
6
7
8
9
10
11
12
# File 'lib/smart_init/main.rb', line 2

def is_callable(opts={})
  method_name = if name_from_opts = opts[:method_name]
    name_from_opts.to_sym
  else
    :call
  end

  define_singleton_method method_name do |*parameters|
    new(*parameters).public_send(method_name)
  end
end