I still have a poor Solaris experience to give a good answer.
I think the modules should be easy to use (plug and play) and reusable, giving options to allow customizations.
So I suppose you should decide to choose a good and largely used source/provider and make the module based on it, eventually adding options to customize and override your default choices.
So, for example adding a parameter like package_provider in each module (leaving it undef for other OS (let Puppet decide) and evaluate in the way you think is more appropriate to manage that package on Solaris (blastwave / pkgutil / pkg / sun / sunfreeware ...).
Eventually add in a separated (and overrideable) dependency class the inclusion of the classes/modules that configure correctly the chosen package repository).
For various other options which may change according to the "solution" you choose (owners/paths/names...) there should be already most of the parameters available in a standard (42) module.
You can decide to leave to the user with a single parameter which "installation method/provider/source" to use, but this can make the module quite more complex, as the default values of various other parameters would change according to the value of that main one, and you can't place anymore the defaults in the params class, but you have to recalculate them in the main class (giving the current structure of the example42 modules).
An example of what I mean is in this module:
https://github.com/example42/puppet-graylog2where some parameters (like the path of the configuration dir) which can't be se in params.pp but have to be calculataed in init.pp with such uglyness:
$real_config_dir = $graylog2::config_dir ? {
'' => $graylog2::install ? {
package => '/etc/graylog2/',
default => "${graylog2::home}/config/",
},
default => $graylog2::config_dir,
}
So, generally, allowing the user to choose how to install an application (or, for example, which package provider to use in Solaris, which may provide packages with different names/paths and so on), makes the code more complex and verbose as you need to manage many other parameters according to the value of the parameters which lets the user decide the installation method (and you need to keep the user's ability to set his own values for these params, hence all the above code for just one of them).
On a side note, you probably have already seen this post, which concentrates on pkgutil and OpenCSW, eventually trying to provide in some other ways the dependencies not provided in OpenCSW.
A reusable module is not always the best solution, in some cases a quick and custom approach, based on your own setup and needs, can be preferred.
Obviously I can't accept PRs which are not generic enough to be reusable by others, but they can make life harder, at times.
Hope to have given some useful info.