David E. Wheeler
2009-10-06 21:17:58 UTC
Jiftyers,
I'm now pretty clear on how importing templates works in
Template::Declare. And I think I've got a handle on aliasing, too,
though there may well be some subtleties I've missed. But part of the
reason why it was tough for me to figure out (aside from the lack of
documentation) was the fact that these two methods do very similar
things (interface-wise), though their implementations are very
different. The fact that they both fall under the header "Mixin" only
increased the confusion for me.
Before I document these methods, I'd like to propose a new interface
that incorporates the features of both importing and aliasing, but
gives template authors and users a log more control over composition.
It's simpler, too. I propose a new method: mix. To get the current
behavior of import_templates, you'd use:
mix MyApp::SomeRole under '/somerole';
To get the alias behavior, you'd use:
mix MyApp::Stuff under '/stuff' with { name => 'Larry' };
Furthermore, I'd add another keyword, into, which would allow not just
template authors, but template users to mix stuff around. For example:
mix MyApp::Stuff into MyApp::Main under '/stuff';
This would mix MyApp::Stuff into MyApp::Main -- I do not have to be
the author of MyApp::Main (or re-open the package) to do it. If no
`under` argument is passed, it would default to `caller(0)`, just as
it does now.
At first, I'd probably just have the code dispatch to `alias` and
`import_templates`, even as I'd like to deprecate those methods. But
long-term, it might make sense to make aliases and imported templates
use the same implementation.
I think that this is a cleaner interface, simpler to understand as
mixing, and less prone to confusing users.
Thoughts?
Thanks,
David
I'm now pretty clear on how importing templates works in
Template::Declare. And I think I've got a handle on aliasing, too,
though there may well be some subtleties I've missed. But part of the
reason why it was tough for me to figure out (aside from the lack of
documentation) was the fact that these two methods do very similar
things (interface-wise), though their implementations are very
different. The fact that they both fall under the header "Mixin" only
increased the confusion for me.
Before I document these methods, I'd like to propose a new interface
that incorporates the features of both importing and aliasing, but
gives template authors and users a log more control over composition.
It's simpler, too. I propose a new method: mix. To get the current
behavior of import_templates, you'd use:
mix MyApp::SomeRole under '/somerole';
To get the alias behavior, you'd use:
mix MyApp::Stuff under '/stuff' with { name => 'Larry' };
Furthermore, I'd add another keyword, into, which would allow not just
template authors, but template users to mix stuff around. For example:
mix MyApp::Stuff into MyApp::Main under '/stuff';
This would mix MyApp::Stuff into MyApp::Main -- I do not have to be
the author of MyApp::Main (or re-open the package) to do it. If no
`under` argument is passed, it would default to `caller(0)`, just as
it does now.
At first, I'd probably just have the code dispatch to `alias` and
`import_templates`, even as I'd like to deprecate those methods. But
long-term, it might make sense to make aliases and imported templates
use the same implementation.
I think that this is a cleaner interface, simpler to understand as
mixing, and less prone to confusing users.
Thoughts?
Thanks,
David