module Sprout::Executable

##
# A factory to create concrete Sprout::Executable::Param
# entities from a set of known types.
#
# If an unrecognized Class reference is provided
# we will instantiate it and ensure that it 
# responds to the public members of the 
# Executable::Param interface.
#
# This Factory gives you the ability to create new,
# custom parameter types by simply ensuring they are
# available to Ruby before your executable is 
# interpreted.
#
# Following is an example of a custom Parameter:
#
#   class CustomParam < Sprout::Executable::Param
#     
#     def to_shell
#       "--foo-bar=#{value}"
#     end
#   end
#
# Following is an example Executable that can consume
# the above parameter:
#
#   require 'custom_param'
#
#   class Foo
#     include Sprout::Executable
#
#     add_param :name, CustomParam
#
#   end
#    
# That's it, there is no need to register your custom types
# with the Factory, just get it into your load path and 
# require it.
#
class ParameterFactory

  class << self

    ##
    # This factory allows us to use classes by 
    # reference in the Executable interface. 
    # Since there are already Ruby primitives for
    # String and File and we don't want to clobber 
    # them, we use this factory to convert those
    # to the appropriate types.
    def create type
      # Didn't want to clobber the stdlib references
      # to these two important data types...
      # But wanted to keep the add_param interface
      # clean and simple.
      return StringParam.new if type == String
      return FileParam.new if type == File
      type.new
    end
  end
end

end