I think I prefer requiring a string that is parsed by the type parser. I see no harm in being able to pass a PType instance directly (the type parser could accept that and simply return it). The automatic mapping from Ruby types requires that the user understands how it works, and it is better to enforce passing through either the String based API (works the same way as in the Puppet Language), or via the Type Factory if you are advanced and work with the FunctionWithEverything and you know what you are doing.