Andreas Köberle suggested trying to use generics, about which I know virtually nothing. From the Wikipedia article, they are "algorithms are written in terms of to-be-specified-later types". Ah, that explains it. In Javascript and Ruby, I am used to passing references to classes all the time—something of an informal generics programming. In Dart, it seems, that things need to be a bit more formal.

Back in my HipsterCollection base-class, I can define a generic with the type parameter inside angle brackets:

class HipsterCollection<M> {
// ...
}

Simply reading that, I can look at it as saying that HipsterCollections are built from things of type "M". If I create my HipsterCollection with an explicit type of ComicBook, then perhaps I can create models with the following:

Looking through the spec, it seems that I am running afoul of: "A type parameter cannot be used to name a constructor in an instance creation expression."

Dang. It seems as though generics are quite a useful as I had hoped. If I run in checked mode, I can do things like extending the generic to enforce that the type is a model:

class HipsterCollection<M extends HipsterModel> {
// ...
}

But, coming from the wild west of Ruby and Javascript land, this feel like unnecessary ceremony. Ah well, here's hoping that someday the Dart-lords remove that restriction. For now, I will stick with my model-maker function.