499: def newattr(name, options = {})
500: if name.is_a?(Class)
501: klass = name
502: name = klass.name
503: end
504:
505: unless klass = self.class.attrclass(name)
506: raise Puppet::Error, "Resource type %s does not support parameter %s" % [self.class.name, name]
507: end
508:
509: if @parameters.include?(name)
510: raise Puppet::Error, "Parameter '%s' is already defined in %s" %
511: [name, self.ref]
512: end
513:
514: if provider and ! provider.class.supports_parameter?(klass)
515: missing = klass.required_features.find_all { |f| ! provider.class.feature?(f) }
516: info "Provider %s does not support features %s; not managing attribute %s" % [provider.class.name, missing.join(", "), name]
517: return nil
518: end
519:
520:
521:
522: options[:resource] = self
523: begin
524:
525: return @parameters[name] = klass.new(options)
526: rescue => detail
527: error = Puppet::Error.new("Parameter %s failed: %s" %
528: [name, detail])
529: error.set_backtrace(detail.backtrace)
530: raise error
531: end
532: end