Module: Erector::Needs::ClassMethods

Defined in:
lib/erector/needs.rb

Instance Method Summary collapse

Instance Method Details

#get_needsObject


45
46
47
48
49
50
51
52
# File 'lib/erector/needs.rb', line 45

def get_needs
  @needs ||= []

  ancestors[1..-1].inject(@needs.dup) do |needs, ancestor|
    needs.push(*ancestor.get_needs) if ancestor.respond_to?(:get_needs)
    needs
  end
end

#needed_defaultsObject


58
59
60
61
62
63
# File 'lib/erector/needs.rb', line 58

def needed_defaults
  @needed_defaults ||= get_needs.inject({}) do |defaults, need|
    defaults = need.merge(defaults) if need.is_a? Hash
    defaults
  end
end

#needed_variablesObject


54
55
56
# File 'lib/erector/needs.rb', line 54

def needed_variables
  @needed_variables ||= get_needs.map{|need| need.is_a?(Hash) ? need.keys : need}.flatten
end

#needs(*args) ⇒ Object

Class method by which widget classes can declare that they need certain parameters. If needed parameters are not passed in to #new, then an exception will be thrown (with a hopefully useful message about which parameters are missing). This is intended to catch silly bugs like passing in a parameter called 'name' to a widget that expects a parameter called 'title'.

You can also declare default values for parameters using hash syntax. You can put #needs declarations on multiple lines or on the same line; the only caveat is that if there are default values, they all have to be at the end of the line (so they go into the magic hash parameter).

If a widget has no #needs declaration then it will accept any combination of parameters just like normal. If a widget wants to declare that it takes no parameters, use the special incantation “needs nil” (and don't declare any other needs, or kittens will cry).

Usage:

class FancyForm < Erector::Widget
  needs :title, :show_okay => true, :show_cancel => false
  ...
end

That means that

FancyForm.new(:title => 'Login')

will succeed, as will

FancyForm.new(:title => 'Login', :show_cancel => true)

but

FancyForm.new(:name => 'Login')

will fail.


39
40
41
42
43
# File 'lib/erector/needs.rb', line 39

def needs(*args)
  args.each do |arg|
    (@needs ||= []) << (arg.nil? ? nil : (arg.is_a? Hash) ? arg : arg.to_sym)
  end
end

#needs?(name) ⇒ Boolean

Returns:

  • (Boolean)

65
66
67
# File 'lib/erector/needs.rb', line 65

def needs?(name)
  needed_variables.empty? || needed_variables.include?(name)
end