243: def self.newproperty(name, options = {}, &block)
244: name = symbolize(name)
245:
246:
247:
248: unless options.is_a? Hash
249: raise Puppet::DevError,
250: "Options must be a hash, not #{options.inspect}"
251: end
252:
253: raise Puppet::DevError, "Class #{self.name} already has a property named #{name}" if @validproperties.include?(name)
254:
255: if parent = options[:parent]
256: options.delete(:parent)
257: else
258: parent = Puppet::Property
259: end
260:
261:
262:
263:
264: prop = genclass(name, :parent => parent, :hash => @validproperties, :attributes => options) do
265:
266:
267: if options[:retrieve]
268: define_method(:retrieve) do
269: provider.send(options[:retrieve])
270: end
271: end
272:
273: class_eval(&block) if block
274: end
275:
276:
277: if name == :ensure
278: @properties.unshift prop
279: else
280: @properties << prop
281: end
282:
283: prop
284: end