--- /dev/null
+Puppet::Type.newtype(:concat_fragment) do
+ @doc = "Create a concat fragment to be used by concat.
+ the `concat_fragment` type creates a file fragment to be collected by concat based on the tag.
+ The example is based on exported resources.
+
+ Example:
+ @@concat_fragment { \"uniqe_name_${::fqdn}\":
+ tag => 'unique_name',
+ order => 10, # Optional. Default to 10
+ content => 'some content' # OR
+ content => template('template.erb') # OR
+ source => 'puppet:///path/to/file'
+ }
+ "
+
+ newparam(:name, :namevar => true) do
+ desc "Unique name"
+ end
+
+ newparam(:content) do
+ desc "Content"
+ end
+
+ newparam(:source) do
+ desc "Source"
+ end
+
+ newparam(:order) do
+ desc "Order"
+ defaultto '10'
+ validate do |val|
+ fail Puppet::ParseError, '$order is not a string or integer.' if !(val.is_a? String or val.is_a? Integer)
+ fail Puppet::ParseError, "Order cannot contain '/', ':', or '\n'." if val.to_s =~ /[:\n\/]/
+ end
+ end
+
+ newparam(:tag) do
+ desc "Tag name to be used by concat to collect all concat_fragments by tag name"
+ end
+
+ validate do
+ # Check if either source or content is set. raise error if none is set
+ fail Puppet::ParseError, "Set either 'source' or 'content'" if self[:source].nil? && self[:content].nil?
+
+ # Check if both are set, if so rais error
+ fail Puppet::ParseError, "Can't use 'source' and 'content' at the same time" if !self[:source].nil? && !self[:content].nil?
+ end
+end