# File lib/puppet/transaction/resource_harness.rb, line 31
31:   def perform_changes(resource)
32:     current = resource.retrieve_resource
33: 
34:     cache resource, :checked, Time.now
35: 
36:     return [] if ! allow_changes?(resource)
37: 
38:     current_values = current.to_hash
39:     historical_values = Puppet::Util::Storage.cache(resource).dup
40:     desired_values = {}
41:     resource.properties.each do |property|
42:       desired_values[property.name] = property.should
43:     end
44:     audited_params = (resource[:audit] || []).map { |p| p.to_sym }
45:     synced_params = []
46: 
47:     # Record the current state in state.yml.
48:     audited_params.each do |param|
49:       cache(resource, param, current_values[param])
50:     end
51: 
52:     # Update the machine state & create logs/events
53:     events = []
54:     ensure_param = resource.parameter(:ensure)
55:     if desired_values[:ensure] && !ensure_param.safe_insync?(current_values[:ensure])
56:       events << apply_parameter(ensure_param, current_values[:ensure], audited_params.include?(:ensure), historical_values[:ensure])
57:       synced_params << :ensure
58:     elsif current_values[:ensure] != :absent
59:       work_order = resource.properties # Note: only the resource knows what order to apply changes in
60:       work_order.each do |param|
61:         if desired_values[param.name] && !param.safe_insync?(current_values[param.name])
62:           events << apply_parameter(param, current_values[param.name], audited_params.include?(param.name), historical_values[param.name])
63:           synced_params << param.name
64:         end
65:       end
66:     end
67: 
68:     # Add more events to capture audit results
69:     audited_params.each do |param_name|
70:       if historical_values.include?(param_name)
71:         if historical_values[param_name] != current_values[param_name] && !synced_params.include?(param_name)
72:           event = create_change_event(resource.parameter(param_name), current_values[param_name], true, historical_values[param_name])
73:           event.send_log
74:           events << event
75:         end
76:       else
77:         resource.property(param_name).notice "audit change: newly-recorded value #{current_values[param_name]}"
78:       end
79:     end
80: 
81:     events
82:   end