271: def self.newproperty(name, options = {}, &block)
272: name = symbolize(name)
273:
274:
275:
276: unless options.is_a? Hash
277: raise Puppet::DevError,
278: "Options must be a hash, not %s" % options.inspect
279: end
280:
281: if @validproperties.include?(name)
282: raise Puppet::DevError, "Class %s already has a property named %s" %
283: [self.name, name]
284: end
285:
286: if parent = options[:parent]
287: options.delete(:parent)
288: else
289: parent = Puppet::Property
290: end
291:
292:
293:
294:
295: prop = genclass(name, :parent => parent, :hash => @validproperties, :attributes => options) do
296:
297:
298: if options[:retrieve]
299: define_method(:retrieve) do
300: provider.send(options[:retrieve])
301: end
302: end
303:
304: if block
305: class_eval(&block)
306: end
307: end
308:
309:
310: if name == :ensure
311: @properties.unshift prop
312: else
313: @properties << prop
314: end
315:
316: return prop
317: end