Module: NRSER::Meta::Props::ClassMethods

Defined in:
lib/nrser/meta/props.rb

Overview

Methods added to the including class via ‘extend`.

Instance Method Summary collapse

Instance Method Details

#from_data(data) ⇒ self

TODO:

This needs to be extended to handle prop’d classes nested in arrays and hashes… but for the moment, it is what it is.

Instantiate from a data hash.

Parameters:

  • data (Hash<String, Object>)

Returns:

  • (self)


178
179
180
# File 'lib/nrser/meta/props.rb', line 178

def from_data data
  self.new data.symbolize_keys
end

#prop(name, **opts) ⇒ NRSER::Meta::Props::Prop

Define a property.

Parameters:

  • name (Symbol)

    The name of the property.

  • **opts (Hash{ Symbol => Object })

    Constructor options for Prop.

Returns:

  • (NRSER::Meta::Props::Prop)

    The newly created prop, thought you probably don’t need it (it’s already all bound up on the class at this point), but why not?



136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
# File 'lib/nrser/meta/props.rb', line 136

def prop name, **opts
  ref = NRSER::Meta::Props.get_props_ref self
  
  t.sym.check name
  
  if ref.key? name
    raise ArgumentError.new NRSER.squish <<-END
      Prop #{ name.inspect } already set for #{ self }:
      #{ ref[name].inspect }
    END
  end
  
  prop = Prop.new self, name, **opts
  ref[name] = prop
  
  unless prop.source?
    class_eval do
      define_method(name) do
        prop.get self
      end
      
      # protected
      #   define_method("#{ name }=") do |value|
      #     prop.set self, value
      #   end
    end
  end
  
  prop
end

#props(only_own: false, only_primary: false) ⇒ Hash{ Symbol => NRSER::Meta::Props::Prop }

Get a map of property names to property instances.

Parameters:

  • only_own: (Boolean) (defaults to: false)

    Don’t include super-class properties.

  • only_primary: (Boolean) (defaults to: false)

    Don’t include properties that have a Prop#source.

Returns:



101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
# File 'lib/nrser/meta/props.rb', line 101

def props only_own: false, only_primary: false
  result = if !only_own && superclass.respond_to?(:props)
    superclass.props only_own: only_own, only_primary: only_primary
  else
    {}
  end
  
  own_props = NRSER::Meta::Props.get_props_ref self
  
  if only_primary
    own_props.each {|name, prop|
      if prop.primary?
        result[name] = prop
      end
    }
  else
    result.merge! own_props
  end
  
  result
end